మీడియావికీ:Gadget-Twinkle.js

వికీపీడియా నుండి
Jump to navigation Jump to search

గమనిక: భద్రపరచిన తరువాత, మార్పులను చూడాలంటేమీ బ్రౌజరు కాషె ను తప్పించవలసి రావచ్చు. మొజిల్లా/ ఫైర్‌ఫాక్స్‌/ సఫారి: shift కీని నొక్కి పెట్టి Reload నొక్కండి, లేదా Ctrl-shift-R నొక్కండి (యాపుల్‌ మాక్‌ లో Cmd-shift-R); IE: Ctrl నొక్కి పెట్టి, Refresh నొక్కండి, లేదా Ctrl-F5 నొక్కండి; కాంకరర్‌:: Reload మీట నొక్కండి, లేదా F5 నొక్కండి; ఒపేరా ను వాడే వారు Tools→Preferences కు వెళ్ళి కాషె ను పూర్తిగా తీసివేయ వలసి ఉంటుంది.

/**
 * +-------------------------------------------------------------------------+
 * |                  === WARNING: GLOBAL GADGET FILE ===                    |
 * |                Changes to this page affect many users.                  |
 * |           Please discuss changes at [[WT:TW]] before editing.           |
 * +-------------------------------------------------------------------------+
 *
 * Imported from github [https://github.com/azatoth/twinkle].
 * All changes should be made in the repository, otherwise they will be lost.
 *
 * To update this script from github, you must have a local repository set up. Then
 * follow the instructions at [https://github.com/azatoth/twinkle/blob/master/README.md].
 *
 * ----------
 *
 * This is AzaToth's Twinkle, the popular script sidekick for newbies, admins, and
 * every Wikipedian in between. Visit [[WP:TW]] for more information.
 */

//<nowiki>

(function(window, document, $, undefined) { // Wrap with anonymous function

	var Twinkle = {};
	window.Twinkle = Twinkle; // allow global access

	// for use by custom modules (normally empty)
	Twinkle.initCallbacks = [];
	Twinkle.addInitCallback = function twinkleAddInitCallback(func) {
		Twinkle.initCallbacks.push(func);
	};

	Twinkle.defaultConfig = {};
	/**
	 * Twinkle.defaultConfig.twinkle and Twinkle.defaultConfig.friendly
	 *
	 * This holds the default set of preferences used by Twinkle. (The |friendly| object holds preferences stored in the FriendlyConfig object.)
	 * It is important that all new preferences added here, especially admin-only ones, are also added to
	 * |Twinkle.config.sections| in twinkleconfig.js, so they are configurable via the Twinkle preferences panel.
	 * For help on the actual preferences, see the comments in twinkleconfig.js.
	 */
	Twinkle.defaultConfig.twinkle = {
		// General
		summaryAd: " ([[WP:TW|TW]])",
		deletionSummaryAd: " ([[WP:TW|TW]])",
		protectionSummaryAd: " ([[WP:TW|TW]])",
		userTalkPageMode: "window",
		dialogLargeFont: false,
		// Fluff (revert and rollback)
		openTalkPage: ["agf", "norm", "vand"],
		openTalkPageOnAutoRevert: false,
		markRevertedPagesAsMinor: ["vand"],
		watchRevertedPages: ["agf", "norm", "vand", "torev"],
		offerReasonOnNormalRevert: true,
		confirmOnFluff: false,
		showRollbackLinks: ["diff", "others"],
		// DI (twinkleimage)
		notifyUserOnDeli: true,
		deliWatchPage: "default",
		deliWatchUser: "default",
		// PROD
		watchProdPages: true,
		prodReasonDefault: "",
		logProdPages: false,
		prodLogPageName: "PROD log",
		// CSD
		speedySelectionStyle: "buttonClick",
		speedyPromptOnG7: false,
		watchSpeedyPages: ["g3", "g5", "g10", "g11", "g12"],
		markSpeedyPagesAsPatrolled: true,
		// these next two should probably be identical by default
		notifyUserOnSpeedyDeletionNomination: ["db", "g1", "g2", "g3", "g4", "g6", "g10", "g11", "g12", "a1", "a2", "a3", "a5", "a7", "a9", "a10", "f1", "f2", "f3", "f7", "f9", "f10", "u3", "t2", "t3", "p1", "p2"],
		welcomeUserOnSpeedyDeletionNotification: ["db", "g1", "g2", "g3", "g4", "g6", "g10", "g11", "g12", "a1", "a2", "a3", "a5", "a7", "a9", "a10", "f1", "f2", "f3", "f7", "f9", "f10", "u3", "t2", "t3", "p1", "p2"],
		promptForSpeedyDeletionSummary: ["db", "g1", "g2", "g3", "g4", "g6", "g7", "g8", "g10", "g11", "g12", "a1", "a2", "a3", "a5", "a7", "a9", "a10", "f2", "f4", "f7", "f8", "f10", "t2", "t3", "p1", "p2"],
		openUserTalkPageOnSpeedyDelete: ["db", "g1", "g2", "g3", "g4", "g5", "g10", "g11", "g12", "a1", "a3", "a7", "a9", "a10", "f3", "f7", "f9", "u3", "t2", "p1"],
		deleteTalkPageOnDelete: false,
		deleteRedirectsOnDelete: true,
		deleteSysopDefaultToTag: false,
		speedyWindowHeight: 500,
		speedyWindowWidth: 800,
		logSpeedyNominations: false,
		speedyLogPageName: "CSD log",
		noLogOnSpeedyNomination: ["u1"],
		// Unlink
		unlinkNamespaces: ["0", "100"],
		// Warn
		defaultWarningGroup: "1",
		showSharedIPNotice: true,
		watchWarnings: true,
		blankTalkpageOnIndefBlock: false,
		// XfD
		xfdWatchDiscussion: "default",
		xfdWatchList: "no",
		xfdWatchPage: "default",
		xfdWatchUser: "default",
		// Hidden preferences
		revertMaxRevisions: 50,
		batchdeleteChunks: 50,
		batchDeleteMinCutOff: 5,
		batchMax: 5000,
		batchProtectChunks: 50,
		batchProtectMinCutOff: 5,
		batchundeleteChunks: 50,
		batchUndeleteMinCutOff: 5,
		deliChunks: 500,
		deliMax: 5000,
		proddeleteChunks: 50
	};

	// now some skin dependent config.
	if (mw.config.get("skin") === "vector") {
		Twinkle.defaultConfig.twinkle.portletArea = "right-navigation";
		Twinkle.defaultConfig.twinkle.portletId = "p-twinkle";
		Twinkle.defaultConfig.twinkle.portletName = "TW";
		Twinkle.defaultConfig.twinkle.portletType = "menu";
		Twinkle.defaultConfig.twinkle.portletNext = "p-search";
	} else {
		Twinkle.defaultConfig.twinkle.portletArea = null;
		Twinkle.defaultConfig.twinkle.portletId = "p-cactions";
		Twinkle.defaultConfig.twinkle.portletName = null;
		Twinkle.defaultConfig.twinkle.portletType = null;
		Twinkle.defaultConfig.twinkle.portletNext = null;
	}

	Twinkle.defaultConfig.friendly = {
		// Tag
		groupByDefault: true,
		watchTaggedPages: true,
		markTaggedPagesAsMinor: false,
		markTaggedPagesAsPatrolled: true,
		tagArticleSortOrder: "cat",
		customTagList: [],
		// Welcome
		topWelcomes: false,
		watchWelcomes: true,
		welcomeHeading: "స్వాగతం",
		insertHeadings: true,
		insertUsername: true,
		insertSignature: true, // sign welcome templates, where appropriate
		quickWelcomeMode: "norm",
		quickWelcomeTemplate: "welcome",
		customWelcomeList: [],
		customWelcomeSignature: true,
		// Talkback
		markTalkbackAsMinor: true,
		insertTalkbackSignature: true, // always sign talkback templates
		talkbackHeading: "మీకు కొత్త సందేశాలున్నాయి",
		adminNoticeHeading: "గమనిక",
		mailHeading: "మీకు మెయిలొచ్చింది!",
		// Shared
		markSharedIPAsMinor: true
	};

	Twinkle.getPref = function twinkleGetPref(name) {
		var result;
		if (typeof Twinkle.prefs === "object" && typeof Twinkle.prefs.twinkle === "object") {
			// look in Twinkle.prefs (twinkleoptions.js)
			result = Twinkle.prefs.twinkle[name];
		} else if (typeof window.TwinkleConfig === "object") {
			// look in TwinkleConfig
			result = window.TwinkleConfig[name];
		}

		if (result === undefined) {
			return Twinkle.defaultConfig.twinkle[name];
		}
		return result;
	};

	Twinkle.getFriendlyPref = function twinkleGetFriendlyPref(name) {
		var result;
		if (typeof Twinkle.prefs === "object" && typeof Twinkle.prefs.friendly === "object") {
			// look in Twinkle.prefs (twinkleoptions.js)
			result = Twinkle.prefs.friendly[name];
		} else if (typeof window.FriendlyConfig === "object") {
			// look in FriendlyConfig
			result = window.FriendlyConfig[name];
		}

		if (result === undefined) {
			return Twinkle.defaultConfig.friendly[name];
		}
		return result;
	};



	/**
	 * **************** twAddPortlet() ****************
	 *
	 * Adds a portlet menu to one of the navigation areas on the page.
	 * This is necessarily quite a hack since skins, navigation areas, and
	 * portlet menu types all work slightly different.
	 *
	 * Available navigation areas depend on the skin used.
	 * Monobook:
	 *  "column-one", outer div class "portlet", inner div class "pBody". Existing portlets: "p-cactions", "p-personal", "p-logo", "p-navigation", "p-search", "p-interaction", "p-tb", "p-coll-print_export"
	 *  Special layout of p-cactions and p-personal through specialized styles.
	 * Vector:
	 *  "mw-panel", outer div class "portal", inner div class "body". Existing portlets/elements: "p-logo", "p-navigation", "p-interaction", "p-tb", "p-coll-print_export"
	 *  "left-navigation", outer div class "vector-menu-tabs" or "vector-menu", inner div class "" or "menu". Existing portlets: "p-namespaces", "p-variants" (menu)
	 *  "right-navigation", outer div class "vector-menu-tabs" or "vector-menu", inner div class "" or "menu". Existing portlets: "p-views", "p-cactions" (menu), "p-search"
	 *  Special layout of p-personal portlet (part of "head") through specialized styles.
	 * Modern:
	 *  "mw_contentwrapper" (top nav), outer div class "portlet", inner div class "pBody". Existing portlets or elements: "p-cactions", "mw_content"
	 *  "mw_portlets" (sidebar), outer div class "portlet", inner div class "pBody". Existing portlets: "p-navigation", "p-search", "p-interaction", "p-tb", "p-coll-print_export"
	 *
	 * @param String navigation -- id of the target navigation area (skin dependant, on vector either of "left-navigation", "right-navigation", or "mw-panel")
	 * @param String id -- id of the portlet menu to create, preferably start with "p-".
	 * @param String text -- name of the portlet menu to create. Visibility depends on the class used.
	 * @param String type -- type of portlet. Currently only used for the vector non-sidebar portlets, pass "menu" to make this portlet a drop down menu.
	 * @param Node nextnodeid -- the id of the node before which the new item should be added, should be another item in the same list, or undefined to place it at the end.
	 *
	 * @return Node -- the DOM node of the new item (a DIV element) or null
	 */
	function twAddPortlet(navigation, id, text, type, nextnodeid) {
		//sanity checks, and get required DOM nodes
		var root = document.getElementById(navigation) || document.querySelector(navigation);
		if (!root) {
			return null;
		}

		var item = document.getElementById(id);
		if (item) {
			if (item.parentNode && item.parentNode === root) {
				return item;
			}
			return null;
		}

		var nextnode;
		if (nextnodeid) {
			nextnode = document.getElementById(nextnodeid);
		}

		//verify/normalize input
		var skin = mw.config.get('skin');
		if (skin !== 'vector' || (navigation !== 'left-navigation' && navigation !== 'right-navigation')) {
			type = null; // menu supported only in vector's #left-navigation & #right-navigation
		}
		var outerDivClass, innerDivClass;
		switch (skin) {
			case "vector":
				// XXX: portal doesn't work
				if (navigation !== "portal" && navigation !== "left-navigation" && navigation !== "right-navigation") {
					navigation = "mw-panel";
				}
				outerDivClass = 'vector-menu vector-menu-' + (navigation === 'mw-panel' ? 'portal' : type === 'menu' ? 'dropdown' : 'tabs');
				innerDivClass = 'vector-menu-content';
				break;
			case "modern":
				if (navigation !== "mw_portlets" && navigation !== "mw_contentwrapper") {
					navigation = "mw_portlets";
				}
				outerDivClass = "portlet";

				break;
			case 'timeless':
				outerDivClass = "mw-portlet";
				innerDivClass = 'mw-portlet-body';
				break;
			default:
				navigation = "column-one";
				outerDivClass = "portlet";
				break;
		}

		// Build the DOM elements.
		var outerDiv = document.createElement("nav");
		outerDiv.setAttribute('aria-labelledby', id + '-label');
		// Vector getting vector-menu-empty FIXME TODO
		outerDiv.className = outerDivClass + " emptyPortlet";
		outerDiv.id = id;

		if (nextnode && nextnode.parentNode === root) {
			root.insertBefore(outerDiv, nextnode);
		} else {
			root.appendChild(outerDiv);
		}

		var h3 = document.createElement("h3");
		h3.id = id + '-label';
		var ul = document.createElement('ul');
		if (skin === "vector") {

			// add invisible checkbox to keep menu open when clicked
			// similar to the p-cactions ("More") menu
			if (outerDivClass.indexOf('vector-menu-dropdown') !== -1) {
				var chkbox = document.createElement('input');
				chkbox.className = 'vectorMenuCheckbox vector-menu-checkbox'; // remove vectorMenuCheckbox after 1.35-wmf.37 goes live
				chkbox.setAttribute('type', 'checkbox');
				chkbox.setAttribute('aria-labelledby', id + '-label');
				outerDiv.appendChild(chkbox);
				var span = document.createElement('span');
				span.appendChild(document.createTextNode(text));
				h3.appendChild(span);
				var a = document.createElement('a');
				a.href = '#';
				$(a).click(function(e) {
					e.preventDefault();
				});
				h3.appendChild(a);
			}
			outerDiv.appendChild(h3);
			ul.className = 'menu vector-menu-content-list'; // remove menu after 1.35-wmf.37 goes live   
		} else {
			h3.appendChild(document.createTextNode(text));
			outerDiv.appendChild(h3);
		}

		if (innerDivClass) {
			var innerDiv = document.createElement("div"); // Not strictly necessary with type vectorTabs, or other skins.
			innerDiv.className = innerDivClass;
			innerDiv.appendChild(ul);
			outerDiv.appendChild(innerDiv);
		} else {
			outerDiv.appendChild(ul);
		}
		return outerDiv;
	};


	/**
	 * **************** twAddPortletLink() ****************
	 * Builds a portlet menu if it doesn't exist yet, and add the portlet link.
	 * @param task: Either a URL for the portlet link or a function to execute.
	 */
	function twAddPortletLink(task, text, id, tooltip) {
		if (Twinkle.getPref("portletArea") !== null) {
			twAddPortlet(Twinkle.getPref("portletArea"), Twinkle.getPref("portletId"), Twinkle.getPref("portletName"), Twinkle.getPref("portletType"), Twinkle.getPref("portletNext"));
		}
		var link = mw.util.addPortletLink(Twinkle.getPref("portletId"), typeof task === "string" ? task : "#", text, id, tooltip);
		if ($.isFunction(task)) {
			$(link).click(function(ev) {
				task();
				ev.preventDefault();
			});
		}
		return link;
	}

	// Check if account is experienced enough to use Twinkle
	var twinkleUserAuthorized = Morebits.userIsInGroup("autoconfirmed") || Morebits.userIsInGroup("confirmed");

	/*
	 ****************************************
	 *** friendlyshared.js: Shared IP tagging module
	 ****************************************
	 * Mode of invocation:     Tab ("Shared")
	 * Active on:              Existing IP user talk pages
	 * Config directives in:   FriendlyConfig
	 */

	Twinkle.shared = function friendlyshared() {
		if (mw.config.get('wgNamespaceNumber') === 3 && Morebits.isIPAddress(mw.config.get('wgTitle'))) {
			var username = mw.config.get('wgTitle').split('/')[0].replace(/\"/, "\\\""); // only first part before any slashes
			twAddPortletLink(function() {
				Twinkle.shared.callback(username);
			}, "Shared IP", "friendly-shared", "Shared IP tagging");
		}
	};

	Twinkle.shared.callback = function friendlysharedCallback(uid) {
		var Window = new Morebits.simpleWindow(600, 400);
		Window.setTitle("షేరు ఐపీ అడ్రసుకు ట్యాగు పెట్టడం");
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#shared");

		var form = new Morebits.quickForm(Twinkle.shared.callback.evaluate);

		var div = form.append({
			type: 'div',
			id: 'sharedip-templatelist'
		});
		div.append({
			type: 'header',
			label: 'షేరు ఐపీ అడ్రసు మూసలు'
		});
		div.append({
			type: 'radio',
			name: 'shared',
			list: Twinkle.shared.standardList,
			event: function(e) {
				Twinkle.shared.callback.change_shared(e);
				e.stopPropagation();
			}
		});

		var org = form.append({
			type: 'field',
			label: 'ఇతర వివరాలను నింపి \"పంపించు\" నొక్కండి'
		});
		org.append({
			type: 'input',
			name: 'organization',
			label: 'ఐపీ అడ్రసు స్వంతదారు/ఆపరేటరు',
			disabled: true,
			tooltip: 'ఐపీ అడ్రసు స్వంతదారు లేదా నడిపే సంస్థ పేరును ఇవ్వవచ్చు. అవసరమైతే వికీమార్కప్ వాడవచ్చు.'
		});
		org.append({
			type: 'input',
			name: 'host',
			label: 'హోస్టు పేరు (ఐచ్ఛికం)',
			disabled: true,
			tooltip: 'హోస్టు పేరు (ఉదాహరణకు, proxy.example.com) ఇక్కడ ఇవ్వవచ్చు. దానికి మూస నుండి లింకు ఇస్తాం.'
		});
		org.append({
			type: 'input',
			name: 'contact',
			label: 'సంపర్క సమాచారం (అభ్యర్థిస్తేనే)',
			disabled: true,
			tooltip: 'సంస్థ సంపర్క సమాచారం కొంత ఇవ్వవచ్చు. అలా ఇవ్వమని ప్రత్యేకించి ఆ సంస్థ అడిగితేనే ఇవ్వండి. అవసరమైతే వికీమార్కప్ వాడవచ్చు.'
		});

		form.append({
			type: 'submit'
		});

		var result = form.render();
		Window.setContent(result);
		Window.display();

		$(result).find('div#sharedip-templatelist').addClass('quickform-scrollbox');
	};

	Twinkle.shared.standardList = [{
		label: '{{Shared IP}}: ప్రామాణిక షేర్ ఐపీ అడ్రసు మూస',
		value: 'Shared IP',
		tooltip: 'ఐపీ వాడుకరులకు సహాయపడే సమాచారాన్ని ఇచ్చేందుకూ, వారిని హెచ్చరించాలని/నిరోధించాలని/నిషేధించాలని అనుకునేవారికీ ఉపయోగపడే ఐపీ వాడుకరి చర్చ పేజీ మూస'
	}, {
		label: '{{Shared IP edu}}: విద్యా సంస్థల కోసం సవరించిన షేర్ ఐపీ అడ్రసు మూస',
		value: 'Shared IP edu'
	}, {
		label: '{{Shared IP corp}}: వ్యాపార సంస్థల కోసం సవరించిన షేర్ ఐపీ అడ్రసు మూస',
		value: 'Shared IP corp'
	}, {
		label: '{{Shared IP public}}: ప్రజాబాహుళ్య కంప్యూటర్ల కోసం సవరించిన షేర్ ఐపీ అడ్రసు మూస',
		value: 'Shared IP public'
	}, {
		label: '{{Shared IP gov}}: ప్రభుత్వ సంస్థలు, ఏజెన్సీల కోసం సవరించిన షేర్ ఐపీ అడ్రసు మూస',
		value: 'Shared IP gov'
	}, {
		label: '{{Dynamic IP}}: డైనమిక్ అడ్రసులు ఉండే సంస్థల కోసం సవరించిన షేర్ ఐపీ అడ్రసు మూస',
		value: 'Dynamic IP'
	}, {
		label: '{{Static IP}}: స్థిత ఐపీ అడ్రసుల కోసం సవరించిన షేర్ ఐపీ అడ్రసు మూస',
		value: 'Static IP'
	}, {
		label: '{{ISP}}: ఐఎస్‌పి సంస్థల (ముఖ్యంగా ప్రాక్సీలు) కోసం సవరించిన షేర్ ఐపీ అడ్రసు మూస',
		value: 'ISP'
	}, {
		label: '{{Mobile IP}}: మొబైలు ఫోను కంపెనీలు, వారి వినియోగదారుల కోసం సవరించిన షేర్ ఐపీ అడ్రసు మూస',
		value: 'Mobile IP'
	}, {
		label: '{{Whois}}: స్థిర ఐపీలో, డైనమిక్ ఐపీలో, షేరు ఐపీలో తెలియని, కానీ పర్యవేక్షణలో ఉంచాల్సిన వాటి కోసం సవరించిన షేర్ ఐపీ అడ్రసు మూస',
		value: 'Whois'
	}];

	Twinkle.shared.callback.change_shared = function friendlysharedCallbackChangeShared(e) {
		e.target.form.contact.disabled = (e.target.value !== 'Shared IP edu'); // only supported by {{Shared IP edu}}
		e.target.form.organization.disabled = false;
		e.target.form.host.disabled = (e.target.value === 'Whois'); // host= not supported by {{Whois}}
	};

	Twinkle.shared.callbacks = {
		main: function(pageobj) {
			var params = pageobj.getCallbackParameters();
			var pageText = pageobj.getPageText();
			var found = false;
			var text = '{{';

			for (var i = 0; i < Twinkle.shared.standardList.length; i++) {
				var tagRe = new RegExp('(\\{\\{' + Twinkle.shared.standardList[i].value + '(\\||\\}\\}))', 'im');
				if (tagRe.exec(pageText)) {
					Morebits.status.warn('Info', 'Found {{' + Twinkle.shared.standardList[i].value + '}} on the user\'s talk page already...aborting');
					found = true;
				}
			}

			if (found) {
				return;
			}

			Morebits.status.info('Info', 'షేరు ఐపీ అడ్రసు మూసను, వాడుకరి చర్చ పేజీలో పైన చేరుస్తాం.');
			text += params.value + '|' + params.organization;
			if (params.value === 'Shared IP edu' && params.contact !== '') {
				text += '|' + params.contact;
			}
			if (params.value !== 'Whois' && params.host !== '') {
				text += '|host=' + params.host;
			}
			text += '}}\n\n';

			var summaryText = '{{[[మూస:' + params.value + '|' + params.value + ']]}} మూసను చేర్చారు.';
			pageobj.setPageText(text + pageText);
			pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
			pageobj.setMinorEdit(Twinkle.getFriendlyPref('markSharedIPAsMinor'));
			pageobj.setCreateOption('recreate');
			pageobj.save();
		}
	};

	Twinkle.shared.callback.evaluate = function friendlysharedCallbackEvaluate(e) {
		var shared = e.target.getChecked('shared');
		if (!shared || shared.length <= 0) {
			alert('షేరు ఐపీ అడ్రసు మూస నొకదాన్ని మీరు ఎంచుకోవాలి!');
			return;
		}

		var value = shared[0];

		if (e.target.organization.value === '') {
			alert('{{' + value + '}} మూస కోసం ఒక సంస్థ పేరు ఇవ్వాలి!');
			return;
		}

		var params = {
			value: value,
			organization: e.target.organization.value,
			host: e.target.host.value,
			contact: e.target.contact.value
		};

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(e.target);

		Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
		Morebits.wiki.actionCompleted.notice = "ట్యాగు పెట్టడం పూర్తయింది. కొద్ది సెకండ్లలో చర్చ పేజీని తిరిగి లోడు చేస్తాం";

		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "వాడుకరి చర్చ పేజీ మార్పు");
		wikipedia_page.setFollowRedirect(true);
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.load(Twinkle.shared.callbacks.main);
	};

	/*
	 ****************************************
	 *** friendlytag.js: Tag module
	 ****************************************
	 * Mode of invocation:     Tab ("Tag")
	 * Active on:              Existing articles; file pages with a corresponding file
	 *                         which is local (not on Commons); existing subpages of
	 *                         {Wikipedia|Wikipedia talk}:Articles for creation;
	 *                         all redirects
	 * Config directives in:   FriendlyConfig
	 */

	Twinkle.tag = function friendlytag() {
		// redirect tagging
		if (Morebits.wiki.isPageRedirect()) {
			Twinkle.tag.mode = 'redirect';
			twAddPortletLink(Twinkle.tag.callback, "Tag", "friendly-tag", "Tag redirect");
		}
		// file tagging
		else if (mw.config.get('wgNamespaceNumber') === 6 && !document.getElementById("mw-sharedupload") && document.getElementById("mw-imagepage-section-filehistory")) {
			Twinkle.tag.mode = 'file';
			twAddPortletLink(Twinkle.tag.callback, "Tag", "friendly-tag", "Add maintenance tags to file");
		}
		// article/draft article tagging
		else if ((mw.config.get('wgNamespaceNumber') === 0 || /^Wikipedia([ _]talk)?\:Articles[ _]for[ _]creation\//.exec(mw.config.get('wgPageName'))) && mw.config.get('wgCurRevisionId')) {
			Twinkle.tag.mode = 'article';
			twAddPortletLink(Twinkle.tag.callback, "Tag", "friendly-tag", "Add maintenance tags to article");
		}
	};

	Twinkle.tag.callback = function friendlytagCallback(uid) {
		var Window = new Morebits.simpleWindow(630, (Twinkle.tag.mode === "article") ? 450 : 400);
		Window.setScriptName("ట్వింకిల్");
		// anyone got a good policy/guideline/info page/instructional page link??
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#tag");

		var form = new Morebits.quickForm(Twinkle.tag.callback.evaluate);

		switch (Twinkle.tag.mode) {
			case 'article':
				Window.setTitle("వ్యాసాల్లో నిర్వహణ ట్యాగులు పెట్టడం");

				form.append({
					type: 'checkbox',
					list: [{
						label: 'వీలైతే {{multiple issues}} గా గుదిగుచ్చి చూపించు',
						value: 'group',
						name: 'group',
						tooltip: '{{multiple issues}} మద్దతు ఉండే మూడు అంతకంటే ఎక్కువ మూసలను వాడుతోంటే, ఈ పెట్టెలో టిక్కు కూడా పెట్టి ఉంటే, మద్దతు ఉండే మూసలన్నిటిన్నీ {{multiple issues}} మూసలో చేర్చి చూపిస్తాం.',
						checked: Twinkle.getFriendlyPref('groupByDefault')
					}]
				});

				form.append({
					type: 'select',
					name: 'sortorder',
					label: 'ఈ జాబితాను ఇలా చూపించు:',
					tooltip: 'మీ ట్వింకిల్ అభిరుచుల్లో (వికీపీడియా:Twinkle/Preferences) డిఫాల్టుగా చూసే వరుసను మార్చుకోవచ్చు.',
					event: Twinkle.tag.updateSortOrder,
					list: [{
						type: 'option',
						value: 'cat',
						label: 'వర్గాల వారీగా',
						selected: Twinkle.getFriendlyPref('tagArticleSortOrder') === 'cat'
					}, {
						type: 'option',
						value: 'alpha',
						label: 'అక్షర క్రమంలో',
						selected: Twinkle.getFriendlyPref('tagArticleSortOrder') === 'alpha'
					}]
				});

				form.append({
					type: 'div',
					id: 'tagWorkArea'
				});

				if (Twinkle.getFriendlyPref('customTagList').length) {
					form.append({
						type: 'header',
						label: 'కస్టమ్ ట్యాగులు'
					});
					form.append({
						type: 'checkbox',
						name: 'articleTags',
						list: Twinkle.getFriendlyPref('customTagList')
					});
				}
				break;

			case 'file':
				Window.setTitle("దస్త్రాల్లో నిర్వహణ ట్యాగులు పెట్టడం");

				// TODO: perhaps add custom tags TO list of checkboxes

				form.append({
					type: 'header',
					label: 'లైసెన్సులు, వనరుల సమస్యల ట్యాగులు'
				});
				form.append({
					type: 'checkbox',
					name: 'imageTags',
					list: Twinkle.tag.file.licenseList
				});

				form.append({
					type: 'header',
					label: 'వికీమీడియా కామన్సుకు సంబంధించిన ట్యాగులు'
				});
				form.append({
					type: 'checkbox',
					name: 'imageTags',
					list: Twinkle.tag.file.commonsList
				});

				form.append({
					type: 'header',
					label: 'శుద్ధి ట్యాగులు'
				});
				form.append({
					type: 'checkbox',
					name: 'imageTags',
					list: Twinkle.tag.file.cleanupList
				});

				form.append({
					type: 'header',
					label: 'బొమ్మ నాణ్యత ట్యాగులు'
				});
				form.append({
					type: 'checkbox',
					name: 'imageTags',
					list: Twinkle.tag.file.qualityList
				});

				form.append({
					type: 'header',
					label: 'రీప్లేస్‌మెంటు ట్యాగులు'
				});
				form.append({
					type: 'checkbox',
					name: 'imageTags',
					list: Twinkle.tag.file.replacementList
				});
				break;

			case 'redirect':
				Window.setTitle("దారిమార్పు ట్యాగులు");

				form.append({
					type: 'header',
					label: 'అక్షరక్రమ దోషాల వంటి భాషాదోషాల మూసలు'
				});
				form.append({
					type: 'checkbox',
					name: 'redirectTags',
					list: Twinkle.tag.spellingList
				});

				form.append({
					type: 'header',
					label: 'ప్రత్యామ్నాయ పేరు మూసలు'
				});
				form.append({
					type: 'checkbox',
					name: 'redirectTags',
					list: Twinkle.tag.alternativeList
				});

				form.append({
					type: 'header',
					label: 'ఇతరత్రా, నిర్వహణా పరమైన దారిమార్పు మూసలు'
				});
				form.append({
					type: 'checkbox',
					name: 'redirectTags',
					list: Twinkle.tag.administrativeList
				});
				break;

			default:
				alert("Twinkle.tag: unknown mode " + Twinkle.tag.mode);
				break;
		}

		form.append({
			type: 'submit'
		});

		var result = form.render();
		Window.setContent(result);
		Window.display();

		if (Twinkle.tag.mode === "article") {
			// fake a change event on the sort dropdown, to initialize the tag list
			var evt = document.createEvent("Event");
			evt.initEvent("change", true, true);
			result.sortorder.dispatchEvent(evt);
		}
	};

	Twinkle.tag.checkedTags = [];

	Twinkle.tag.updateSortOrder = function(e) {
		var sortorder = e.target.value;
		var $workarea = $(e.target.form).find("div#tagWorkArea");

		Twinkle.tag.checkedTags = e.target.form.getChecked("articleTags");
		if (!Twinkle.tag.checkedTags) {
			Twinkle.tag.checkedTags = [];
		}

		// function to generate a checkbox, with appropriate subgroup if needed
		var makeCheckbox = function(tag, description) {
			var checkbox = {
				value: tag,
				label: "{{" + tag + "}}: " + description
			};
			if (Twinkle.tag.checkedTags.indexOf(tag) !== -1) {
				checkbox.checked = true;
			}
			if (tag === "globalize") {
				checkbox.subgroup = {
					name: 'globalize',
					type: 'select',
					list: [{
						label: "{{globalize}}: ఈ వ్యాసం, విషయానికి సంబంధించి ప్రపంచవ్యాప్త దృక్కోణాన్ని చూపిస్తున్నట్లుగా లేదు",
						value: "globalize"
					}, {
						label: "Region-specific {{globalize}} subtemplates",
						list: [{
							label: "{{globalize/Australia}}: article deals primarily with the Australian viewpoint",
							value: "globalize/Australia"
						}, {
							label: "{{globalize/Canada}}: article deals primarily with the Canadian viewpoint",
							value: "globalize/Canada"
						}, {
							label: "{{globalize/China}}: article deals primarily with the Chinese viewpoint",
							value: "globalize/China"
						}, {
							label: "{{globalize/Common law}}: article deals primarily with the viewpoint of common law countries",
							value: "globalize/Common law"
						}, {
							label: "{{globalize/Eng}}: article deals primarily with the English-speaking viewpoint",
							value: "globalize/Eng"
						}, {
							label: "{{globalize/Europe}}: article deals primarily with the European viewpoint",
							value: "globalize/Europe"
						}, {
							label: "{{globalize/France}}: article deals primarily with the French viewpoint",
							value: "globalize/France"
						}, {
							label: "{{globalize/Germany}}: article deals primarily with the German viewpoint",
							value: "globalize/Germany"
						}, {
							label: "{{globalize/India}}: article deals primarily with the Indian viewpoint",
							value: "globalize/India"
						}, {
							label: "{{globalize/Middle East}}: article deals primarily with the Middle Eastern viewpoint",
							value: "globalize/Middle East"
						}, {
							label: "{{globalize/North America}}: article deals primarily with the North American viewpoint",
							value: "globalize/North America"
						}, {
							label: "{{globalize/Northern}}: article deals primarily with the northern hemisphere viewpoint",
							value: "globalize/Northern"
						}, {
							label: "{{globalize/Southern}}: article deals primarily with the southern hemisphere viewpoint",
							value: "globalize/Southern"
						}, {
							label: "{{globalize/South Africa}}: article deals primarily with the South African viewpoint",
							value: "globalize/South Africa"
						}, {
							label: "{{globalize/UK}}: article deals primarily with the British viewpoint",
							value: "globalize/UK"
						}, {
							label: "{{globalize/UK and Canada}}: article deals primarily with the British and Canadian viewpoints",
							value: "globalize/UK and Canada"
						}, {
							label: "{{globalize/US}}: article deals primarily with the USA viewpoint",
							value: "globalize/US"
						}, {
							label: "{{globalize/West}}: article deals primarily with the viewpoint of Western countries",
							value: "globalize/West"
						}]
					}]
				};
			} else if (tag === "notability") {
				checkbox.subgroup = {
					name: 'notability',
					type: 'select',
					list: [{
						label: "{{notability}}: వ్యాస విషయం సాధారణ విషయ ప్రాముఖ్యత మార్గదర్శకాలకు అనుగుణంగా లేదు",
						value: "none"
					}, {
						label: "{{notability|Academics}}: విద్యా సంబంధ విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Academics"
					}, {
						label: "{{notability|Biographies}}: జీవిత చరిత్రల విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Biographies"
					}, {
						label: "{{notability|Books}}: పుస్తకాల విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Books"
					}, {
						label: "{{notability|Companies}}: కంపెనీలు, సంస్థల విషయ ప్రాముఖ్యత మార్గదర్శకాలు",
						value: "Companies"
					}, {
						label: "{{notability|Events}}: ఘటనల విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Events"
					}, {
						label: "{{notability|Films}}: సినిమాల విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Films"
					}, {
						label: "{{notability|Music}}: సంగీతపు విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Music"
					}, {
						label: "{{notability|Neologisms}}: నియోలాగిజముల విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Neologisms"
					}, {
						label: "{{notability|Numbers}}: సంఖ్యల విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Numbers"
					}, {
						label: "{{notability|Products}}: ఉత్పత్తులు, సేవల విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Products"
					}, {
						label: "{{notability|Sport}}: క్రీడలు, కసరత్తుల విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Sport"
					}, {
						label: "{{notability|Web}}: వెబ్ కంటెంటు విషయ ప్రాముఖ్యత మార్గదర్శకం",
						value: "Web"
					}]
				};
			}
			return checkbox;
		};

		// categorical sort order
		if (sortorder === "cat") {
			var div = new Morebits.quickForm.element({
				type: "div",
				id: "tagWorkArea"
			});

			// function to iterate through the tags and create a checkbox for each one
			var doCategoryCheckboxes = function(subdiv, array) {
				var checkboxes = [];
				$.each(array, function(k, tag) {
					var description = Twinkle.tag.article.tags[tag];
					checkboxes.push(makeCheckbox(tag, description));
				});
				subdiv.append({
					type: "checkbox",
					name: "articleTags",
					list: checkboxes
				});
			};

			var i = 0;
			// go through each category and sub-category and append lists of checkboxes
			$.each(Twinkle.tag.article.tagCategories, function(title, content) {
				div.append({
					type: "header",
					id: "tagHeader" + i,
					label: title
				});
				var subdiv = div.append({
					type: "div",
					id: "tagSubdiv" + i++
				});
				if ($.isArray(content)) {
					doCategoryCheckboxes(subdiv, content);
				} else {
					$.each(content, function(subtitle, subcontent) {
						subdiv.append({
							type: "div",
							label: [Morebits.htmlNode("b", subtitle)]
						});
						doCategoryCheckboxes(subdiv, subcontent);
					});
				}
			});

			var rendered = div.render();
			$workarea.replaceWith(rendered);
			var $rendered = $(rendered);
			$rendered.find("h5").css({
				'font-size': '110%',
				'margin-top': '1em'
			});
			$rendered.find("div").filter(":has(span.quickformDescription)").css({
				'margin-top': '0.4em'
			});
		}
		// alphabetical sort order
		else {
			var checkboxes = [];
			$.each(Twinkle.tag.article.tags, function(tag, description) {
				checkboxes.push(makeCheckbox(tag, description));
			});
			var tags = new Morebits.quickForm.element({
				type: "checkbox",
				name: "articleTags",
				list: checkboxes
			});
			$workarea.empty().append(tags.render());
		}
	};


	// Tags for ARTICLES start here

	Twinkle.tag.article = {};

	// A list of all article tags, in alphabetical order
	// To ensure tags appear in the default "categorized" view, add them to the tagCategories hash below.

	Twinkle.tag.article.tags = {
		"advert": "వ్యాసం వ్యాపార ప్రకటన లాగా ఉంది",
		"All plot": "వ్యాసం దాదాపుగా అంతా కథా సంగ్రహం లాగానే ఉంది",
		"autobiography": "వ్యాసం ఒక స్వీయచరిత్ర, తటస్థంగా ఉండకపోవచ్చు",
		"BLP sources": "జీవిత చరిత్ర వ్యాసానికి అదనపు మూలాలు కావాలి",
		"BLP unsourced": "జీవిత చరిత్ర వ్యాసానికి అసలు మూలాలే లేవు (కొత్త వ్యాసాల కోసం BLP PROD వాడండి)",
		"cat improve": "వ్యాసంలో మరిన్ని వర్గాలు ఉండాలేమో",
		"citation style": "వ్యాసం లోని ఇన్‌లైన్ ఉల్లేఖనలు స్పష్టంగా లేవు లేదా పరస్పరం పొసగడం లేదు",
		"cleanup": "వ్యాసాన్ని శుద్ధి పరచవలసిన అవసరం ఉంది",
		"cleanup-reorganize": "వికీపీడియా లేఔట్ మార్గదర్శకాలకు అనుగుణంగా వ్యాసపు రూపును మార్చాలి",
		"close paraphrasing": "కాపీహక్కులున్న, ఉచితం కాని మూలంతో వ్యాసం లోని  భాష బాగా దగ్గరగా ఉంది",
		"COI": "వ్యాసపు సృష్టికర్తకు గాని, ఎక్కువగా కృషి చేసినవారికి గానీ  వ్యాస విషయంపై అన్యథా ఆసక్తులున్నాయి",
		"condense": "వ్యాసంలో మరీ ఎక్కువ విభాగాలు ఉన్నాయనిపిస్తోంది",
		"confusing": "వ్యాసం అస్పష్టంగాను అయోమయంగానూ ఉందనిపిస్తోంది",
		"context": "వ్యాసానికి సరిపడినంతగా సందర్భాన్ని చూపలేదు",
		"copy edit": "అక్షర దోషాలు, వ్యాకరణ దోషాలు, శైలి, పరస్పర వైరుధ్యం, స్వరం మొదలైన వాటిని సవరించాలి",
		"copypaste": "వ్యాసం ఎక్కడినుండో కాపీ చేసి ఇక్కడ పేస్టు చేసినట్టు ఉంది",
		"dead end": "వ్యాసం నుండి ఇతర వ్యాసాలకు లింకులేమీ లేవు",
		"disputed": "వ్యాసం లోని వాస్తవాల ఖచ్చితత్వం సందేహాస్పదంగా ఉంది",
		"essay-like": "వ్యాసాన్ని ఒక ఎస్సే రచన లాగా ఉంది, దాన్ని శుద్ధి చెయ్యాలి",
		"expand language": "వేరే భాష లోని వికీపీడియా నుండి సమాచారాన్ని తెచ్చి ఈ వ్యాసాన్ని విస్తరించవచ్చు",
		"expert-subject": "ఈ వ్యాసాన్ని విషయ నిపుణులు పరిశీలించాల్సిన అవసరం ఉంది",
		"external links": "వ్యాసం లోని బయటి లింకులు విధానాలు, మార్గదర్శకాలకు అనుగుణంగా లేవు",
		"fansite": "వ్యాసం ఏదో ఫ్యాన్‌సైటు లాగా ఉంది",
		"fiction": "వ్యాసం వాస్తవం కల్పనల మధ్య తేడాను గుర్తించలేకుండా ఉంది ",
		"globalize": "వ్యాసం, దాని విషయం గురించిన ప్రపంచవ్యాప్త దృక్కోణాన్ని చూపించడం లేదు",
		"GOCEinuse": "కాపీ ఎడిటర్లు ప్రస్తుతం వ్యాసంలో పెద్ద యెత్తున కాపీ ఎడిట్ చేస్తున్నారు",
		"hoax": "వ్యాసమంతా ఒక హోక్స్ లాగా ఉంది",
		"in-universe": "వ్యాస విషయం కాల్పనికం. దీన్ని కాల్పనికేతర కోణంలో తిరగ రాయాలి",
		"incoherent": "వ్యాసం అసంబద్ధంగా ఉండి, అర్థం చేసుకోవడం చాలా కష్టంగా ఉంది.",
		"in use": "వ్యాసంలో కొద్ది సేపు పెద్ద దిద్దుబాటు జరుగుతుంది",
		"lead missing": "వ్యాసానికి ప్రవేశిక లేదు, రాయాలి. ",
		"lead rewrite": "వ్యాసపు ప్రవేశికను మార్గదర్శకాలకు అనుగుణంగా తిరగరాయాలి.",
		"lead too long": "వ్యాసపు ప్రవేశిక మరీ పెద్దదిగా ఉంది, కుదించాలి.",
		"lead too short": "వ్యాసపు ప్రవేశిక మరీ చిన్నదిగా ఉంది, విస్తరించాలి.",
		"linkrot": "వ్యాసంలో కేవలం URL లను మూలాలుగా వాడారు. ఇది లింకు చెత్త (లింక్ రాట్) కు దారితీయవచ్చు",
		"merge": "ఈ వ్యాసాన్ని పేర్కొనబోయే మరో వ్యాసాన్నీ విలీనం చెయ్యాలి",
		"merge from": "ఈ వ్యాసం లోకి పేర్కొనబోయే మరో వ్యాసాన్నీ విలీనం చెయ్యాలి",
		"merge to": "ఈ వ్యాసాన్ని పేర్కొనబోయే మరో వ్యాసం లోకి విలీనం చెయ్యాలి",
		"metricate": "వ్యాసం ప్రత్యేకించి SI యేతర కొలమానాన్ని వాడుతోంది ",
		"more footnotes": "వ్యాసంలో మూలాలున్నాయి గానీ, పాఠ్యంలో ఉల్లేఖనలు సరిపడినన్ని లేవు",
		"new unreviewed article": "వ్యాసాన్ని తరువాత సమీక్షించాలని గుర్తు పెట్టు",
		"no footnotes": "వ్యాసంలో మూలాలున్నాయి గానీ, పాఠ్యంలో ఉల్లేఖనలు లేవు",
		"non-free": "వ్యాసంలో కాపీహక్కులున్న అంశాలను అమితంగా గానీ, అనుచితంగా గానీ వాడారు",
		"notability": "వ్యాస విషయం, విషయ ప్రాముఖ్యత మార్గదర్శకాలకు అనుగుణంగా లేదు",
		"తెలుగు కాదు": "వ్యాసం వేరే భాషలో రాసి ఉంది. అనువదించాలి.",
		"one source": "వ్యాసం ఒకే మూలంపై పూర్తిగా గాని చాలా వరకు గానీ ఆధారపడి ఉంది",
		"original research": "వ్యాసంలో మౌలిక పరిశోధన గానీ, నిర్ధారణ కాని విశేషాలు గానీ ఉన్నాయి",
		"orphan": "వ్యాసానికి వేరే ఏ ఇతర వ్యాసం నుండి లింకుల్లేవు",
		"out of date": "వ్యాసంలో కాలదోషం పట్టిన సమాచారాన్ని తీసెయ్యడమో తాజాకరించడమో చెయ్యాలి",
		"overcoverage": "వ్యాసంలో ఒక ప్రాంతం లేదా కొన్ని ప్రాంతాలకు అనుకూలంగా పక్షపాత ధోరణి గానీ, చాలా ఎక్కువ కవరేజీ గానీ ఉంది",
		"overlinked": "వ్యాసంలో చాలా ఎక్కువ సంఖ్యలో డూప్లికేటు లింకులు గానీ, సంబంధం లేని లింకులు గానీ ఉన్నాయి",
		"overly detailed": "వ్యాసంలో లోతైన వివరణతో కూడిన పాఠ్యం మరీ ఎక్కువగా ఉంది",
		"peacock": "వ్యాసంలో, వ్యాస విషయాన్ని కీర్తించడానికి తప్ప, సమాచారమేమీ అందించని పదాలు ఉన్నాయి",
		"plot": "వ్యాసం లోని కథా సంగ్రహం మరీ ఎక్కువగా ఉంది",
		"POV": "వ్యాసం తటస్థ దృక్కోణాన్ని చూపించడం లేదు ",
		"primary sources": "వ్యాసం ప్రాథమిక మూలాలపై మరీ ఎక్కువగా ఆధారపడింది. ద్వితీయ స్థాయి మూలాలు అవసరం",
		"prose": "వ్యాసం ఒక జాబితా రూపంలో ఉంది. దీన్ని గద్య రూపంలో రాస్తే బాగుంటుంది",
		"recentism": "వ్యాసం ఇటీవలి ఘటనలపై మొగ్గుతోంది",
		"ref improve": "నిర్ధారణ కోసం వ్యాసంలో మరిన్ని మూలాలు ఉండాలి",
		"rough translation": "వ్యాసంలో అనువాదం బాగాలేదు. శుద్ధి చెయ్యాలి",
		"sections": "వ్యాసాన్ని విభాగాలుగా విభజించాలి",
		"self-published": "వ్యాసం స్వీయ ప్రచురణలను అనుచితంగా ఉల్లేఖిస్తోంది",
		"technical": "సామాన్య పాఠకులకు వ్యాసం మరీ సాంకేతికంగా ఉండవచ్చు",
		"tense": "వ్యాసాన్ని సరైన కాలంలో రాయలేదు",
		"third-party": "వ్యాసం, విషయానికి అనుబంధంగా ఉన్న మూలాలపై మరీ ఎక్కువగా ఆధారపడి ఉంది, థర్డ్ పార్టీ మూలాలు అవసరం",
		"tone": "వ్యాసపు స్వరం సముచితంగా లేదు",
		"too few opinions": "వ్యాసం అన్ని దృక్కోణాలనూ చూపించడం లేదు",
		"uncategorized": "వ్యాసాన్ని వర్గీకరించలేదు",
		"under construction": "వ్యాసం ప్రస్తుతం విస్తరణలో గాని, పెద్ద సంస్కరణలో గానీ ఉంది",
		"underlinked": "వ్యాసంలో మరిన్ని వికీలింకులుంటే బాగుంటుంది",
		"undue": "వ్యాసం, విషయానికి సంబంధించిన కొన్ని అంశాలను మరీ ఎక్కువగా చూపిస్తూ, కొన్నిటిని అలక్ష్యం చేస్తోంది",
		"unreferenced": "వ్యాసంలో అసలు మూలాలే లేవు",
		"unreliable sources": "వ్యాసంలో చూపిన మూలాలు విశ్వసనీయమైనవి కాకపోవచ్చు",
		"update": "వ్యాసంలో మరింత తాజా సమాచారాన్ని చేర్చాలి",
		"very long": "వ్యాసం మరీ పెద్దదిగా ఉంది",
		"weasel": "వీసెల్ పదాలను వాడటంతో వ్యాసం తటస్థతను కోల్పోయింది"
	};

	// A list of tags in order of category
	// Tags should be in alphabetical order within the categories
	// Add new categories with discretion - the list is long enough as is!

	Twinkle.tag.article.tagCategories = {
		"శుద్ధి, నిర్వహణ ట్యాగులు": {
			"సాధారణ శుద్ధి": [
				"cleanup",
				"copy edit"
			],
			"అవాంఛిత కంటెంటు": [
				"close paraphrasing",
				"copypaste",
				"external links",
				"non-free"
			],
			"ఆకృతి, ఫార్మాటింగు, ప్రవేశిక": [
				"cleanup-reorganize",
				"condense",
				"lead missing",
				"lead rewrite",
				"lead too long",
				"lead too short",
				"sections",
				"very long"
			],
			"కల్పన-సంబంధ శుద్ధి": [
				"All plot",
				"fiction",
				"in-universe",
				"plot"
			]
		},
		"సాధారణ కంటెంటు సమస్యలు": {
			"విషయ ప్రాముఖ్యత": [
				"notability" // has subcategories and special-cased code
			],
			"రచనా శైలి": [
				"advert",
				"essay-like",
				"fansite",
				"prose",
				"technical",
				"tense",
				"tone"
			],
			"అర్థం (లేదా అర్థ లేమి)": [
				"confusing",
				"incoherent"
			],
			"సమాచారం, విస్తృతి": [
				"context",
				"expert-subject",
				"metricate",
				"overly detailed",
				"undue"
			],
			"కాలీనత": [
				"out of date",
				"update"
			],
			"తటస్థత, పక్షపాతం, వాస్తవాల ఖచ్చితత్వం": [
				"autobiography",
				"COI",
				"disputed",
				"hoax",
				"globalize", // has subcategories and special-cased code
				"overcoverage",
				"peacock",
				"POV",
				"recentism",
				"too few opinions",
				"weasel"
			],
			"నిర్ధారత్వం, మూలాలు": [
				"BLP sources",
				"BLP unsourced",
				"one source",
				"original research",
				"primary sources",
				"ref improve",
				"self-published",
				"third-party",
				"unreferenced",
				"unreliable sources"
			]
		},
		"నిర్దుష్ట కంటెంటు సమస్యలు": {
			"భాష": [
				"తెలుగు కాదు",
				"rough translation",
				"expand language"
			],
			"లింకులు": [
				"dead end",
				"orphan",
				"overlinked",
				"underlinked"
			],
			"ఉల్లేఖన పద్ధతి": [
				"citation style",
				"linkrot",
				"more footnotes",
				"no footnotes"
			],
			"వర్గాలు": [
				"cat improve",
				"uncategorized"
			]
		},
		"విలీనం": [
			"merge",
			"merge from",
			"merge to"
		],
		"సమాచారం కోసం": [
			"GOCEinuse",
			"in use",
			"new unreviewed article",
			"under construction"
		]
	};

	// Tags for REDIRECTS start here

	Twinkle.tag.spellingList = [{
		label: '{{R from abbreviation}}: పొడిపదాల పేరుతో ఉన్న పేజీ నుండి దారిమార్పు',
		value: 'R from abbreviation'
	}, {
		label: '{{R to list entry}}: ప్రత్యేకంగా ఒక వ్యాసం ఉండేంత ప్రాముఖ్యత లేని \"చిన్నపాటి విషయాల జాబితా\" వ్యాసానికి దారిమార్పు. ఈ పేజీలో వాటికి కొద్దిపాటి వివరణ ఉండే అవకాశం ఉంది. ',
		value: 'R to list entry'
	}, {
		label: '{{R to section}}: {{R to list entry}} లాంటిదే. కాకపోతే, జాబితా వివిధ విభాగాలుగా పేర్చి ఉంటుంది.',
		value: 'R to section'
	}, {
		label: '{{R from misspelling}}: తప్పు అక్షరక్రమంతో లేదా టైపింగు దోషాలతో కూడిన పేరు నుండి దారిమార్పు',
		value: 'R from misspelling'
	}, {
		label: '{{R from alternative spelling}}: వేరే అక్షరక్రమం నుండి చేసిన దారిమార్పు',
		value: 'R from alternative spelling'
	}, {
		label: '{{R from plural}}: బహువచనం నుండి ఏకవచనానికి చేసిన దారిమార్పు',
		value: 'R from plural'
	}, {
		label: '{{R from related word}}: సంబంధిత పదం నుండి చేసిన దారిమార్పు',
		value: 'R from related word'
	}, {
		label: '{{R with possibilities}}: మరింత నిర్దుష్టమైన పేరు గల పేజీ నుండి, మరింత సాధారణమైన, తక్కువ వివరమైన వ్యాసానికి దారిమార్పు. అంచేత దాన్ని విస్తరించవచ్చు, విస్తరించాలి కూడా',
		value: 'R with possibilities'
	}, {
		label: '{{R from member}}: ఒక సమూహం/సంస్థ/బృందం/జట్టు లోని సభ్యుని నుండి ఆ సమూహానికి ఉన్న దారిమార్పు',
		value: 'R from member'
	}, {
		label: '{{R from other capitalisation}}: redirect from a title with another method of capitalisation',
		value: 'R from other capitalisation'
	}];

	Twinkle.tag.alternativeList = [{
		label: '{{R from alternative name}}: ఓ పేరుకు ఉన్న నానార్థాలు, ముద్దుపేరు, కలంపేరు వగైరాల నుండి చేసే దారిమార్పు',
		value: 'R from alternative name'
	}, {
		label: '{{R from full name}}: ఓ పేజీకి దానికి సంబంధించిన పూర్తి పేరు నుండి చేసే దారిమార్పు',
		value: 'R from full name'
	}, {
		label: '{{R from surname}}: ఓ పేజీకి ఇంటిపేరు నుండి చేసే దారిమార్పు',
		value: 'R from surname'
	}, {
		label: '{{R from historic name}}: ఓ పేజీకి గతంలో ఆ స్థలానికి/నగరానికి/రాష్ట్రానికి/దేశానికి ఉన్న పేరు నుండి చేసే దారిమార్పు',
		value: 'R from historic name'
	}, {
		label: '{{R from scientific name}}: శాస్త్రీయ నామం నుండి వాడుకపేరుకు చేసే దారిమార్పు',
		value: 'R from scientific name'
	}, {
		label: '{{R to scientific name}}: వాడుకపేరు నుండి శాస్త్రీయ నామానికి చేసే దారిమార్పు',
		value: 'R to scientific name'
	}, {
		label: '{{R from name and country}}: నిర్దుష్టమైన పేరు నుండి క్లుప్తమైన పేరుకు చేసే దారిమార్పు',
		value: 'R from name and country'
	}, {
		label: '{{R from alternative language}}: ఇంగ్లీషు పేరు నుండి చేసే దారిమార్పు',
		value: 'R from alternative language'
	}, {
		label: '{{R from ASCII}}: redirect from a title in basic ASCII to the formal article title, with differences that are not diacritical marks (accents, umlauts, etc.)',
		value: 'R from ASCII'
	}, {
		label: '{{R from title without diacritics}}: redirect to the article title with diacritical marks (accents, umlauts, etc.)',
		value: 'R from title without diacritics'
	}];

	Twinkle.tag.administrativeList = [{
		label: '{{R from merge}}: విలీనమై పోయిన పేజీ నుండి చేసే దారిమార్పు - దాని చరిత్రను నిలుపుకునేందుకు',
		value: 'R from merge'
	}, {
		label: '{{R to disambiguation page}}: అయోమయ నివృత్తి పేజీ నుండి చేసే దారిమార్పు',
		value: 'R to disambiguation page'
	}, {
		label: '{{R from duplicated article}}: సారూప్యత ఉన్న వ్యాసం నుండి చేసే దారిమార్పు - దాని చరిత్రను నిలుపుకునేందుకు',
		value: 'R from duplicated article'
	}, {
		label: '{{R to decade}}: సంవత్సర పేజీ నుండి దశాబ్ది పేజీకి చేసే దారిమార్పు',
		value: 'R to decade'
	}, {
		label: '{{R from shortcut}}: వికీపీడియా షార్ట్‌కట్ నుండి చేసే దారిమార్పు',
		value: 'R from shortcut'
	}, {
		label: '{{R from CamelCase}}: కామెల్‌కేస్ పేరు నుండి చేసే దారిమార్పు',
		value: 'R from CamelCase'
	}, {
		label: '{{R from EXIF}}: redirect of a wikilink created from JPEG EXIF information (i.e. the \"metadata\" section on some image description pages)',
		value: 'R from EXIF'
	}, {
		label: '{{R from school}}: చాలా కొద్ది సమాచారం ఉన్న పాఠశాల వ్యాసం నుండి చేసే దారిమార్పు',
		value: 'R from school'
	}];

	// maintenance tags for FILES start here

	Twinkle.tag.file = {};

	Twinkle.tag.file.licenseList = [{
		label: '{{Bsr}}: మూలపు సమాచారంలో కేవలం బొమ్మ URL/జనరిక్ URL మాత్రమే ఉంది',
		value: 'Bsr'
	}, {
		label: '{{Non-free reduce}}: సముచిత వినియోగం కింద ఉన్న తక్కువ రిజల్యూషను కాని బొమ్మ (లేదా మరీ పొడుగాటి ఆడియో క్లిప్పు వగైరా) ',
		value: 'Non-free reduce'
	}, {
		label: '{{Non-free reduced}}: తగ్గించిన సముచిత వినియోగపు మీడియా (పాత కూర్పును తొలగించాలి)  ',
		value: 'Non-free reduced'
	}, {
		label: '{{Orphaned non-free revisions}}: తొలగించాల్సిన పాత కూర్పులున్న సముచిత వినియోగపు మీడియా',
		value: 'subst:orfurrev'
	}];

	Twinkle.tag.file.commonsList = [{
		label: '{{Copy to Commons}}: కామన్సుకు తరలించాల్సిన ఉచిత మీడియా',
		value: 'Copy to Commons'
	}, {
		label: '{{Do not move to Commons}} (PD issue): పబ్లిక్ డొమెయినులో ఉన్న దస్త్రమే, కానీ అది ఉద్భవించిన దేశంలో మాత్రం కాదు',
		value: 'Do not move to Commons'
	}, {
		label: '{{Do not move to Commons}} (ఇతర కారణం)',
		value: 'Do not move to Commons_reason'
	}, {
		label: '{{Keep local}}: కామన్సు దస్త్రపు స్థానిక కాపీని ఉంచాలని విజ్ఞప్తి',
		value: 'Keep local'
	}, {
		label: '{{Now Commons}}: దస్త్రాన్ని కామన్సు లోకి కాపీ చేసాం',
		value: 'subst:ncd'
	}];

	Twinkle.tag.file.cleanupList = [{
		label: '{{Artifacts}}: PNG contains residual compression artifacts',
		value: 'Artifacts'
	}, {
		label: '{{Bad font}}: థంబ్‌నెయిల్ సర్వరులో లేని ఫాంట్లను వాడుతోన్న SVG',
		value: 'Bad font'
	}, {
		label: '{{Bad format}}: మరింత ఉపయోగకరమైన ఫార్మాటు లోకి మార్చాల్సిన PDF/DOC/... దస్త్రం',
		value: 'Bad format'
	}, {
		label: '{{Bad GIF}}: PNG, JPEG, SVG లలో ఏదో ఒక రూపంలో ఉండాల్సిన GIF',
		value: 'Bad GIF'
	}, {
		label: '{{Bad JPEG}}: PNG, SVG లలో ఏదో ఒక రూపంలో ఉండాల్సిన GIF',
		value: 'Bad JPEG'
	}, {
		label: '{{Bad trace}}: auto-traced SVG requiring cleanup',
		value: 'Bad trace'
	}, {
		label: '{{Cleanup image}}: సాధారణ శుద్ధి',
		value: 'Cleanup image'
	}, {
		label: '{{Cleanup SVG}}: SVG needing code and/or appearance cleanup',
		value: 'Cleanup SVG'
	}, {
		label: '{{ClearType}}: image (not screenshot) with ClearType anti-aliasing',
		value: 'ClearType'
	}, {
		label: '{{Imagewatermark}}: image contains visible or invisible watermarking',
		value: 'Imagewatermark'
	}, {
		label: '{{NoCoins}}: image using coins to indicate scale',
		value: 'NoCoins'
	}, {
		label: '{{Overcompressed JPEG}}: JPEG with high levels of artifacts',
		value: 'Overcompressed JPEG'
	}, {
		label: '{{Opaque}}: opaque background should be transparent',
		value: 'Opaque'
	}, {
		label: '{{Remove border}}: unneeded border, white space, etc.',
		value: 'Remove border'
	}, {
		label: '{{Rename media}}: file should be renamed according to the criteria at [[WP:FMV]]',
		value: 'Rename media'
	}, {
		label: '{{Should be PNG}}: GIF or JPEG should be lossless',
		value: 'Should be PNG'
	}, {
		label: '{{Should be SVG}}: PNG, GIF or JPEG should be vector graphics',
		value: 'Should be SVG',
		subgroup: {
			name: 'svgCategory',
			type: 'select',
			list: [{
				label: '{{Should be SVG|other}}',
				value: 'other'
			}, {
				label: '{{Should be SVG|alphabet}}: అక్షరాల బొమ్మలు, ఫాంటు నమూనాలు వగైరా.',
				value: 'alphabet'
			}, {
				label: '{{Should be SVG|chemical}}: రసాయనిక బొమ్మలు వగైరా.',
				value: 'chemical'
			}, {
				label: '{{Should be SVG|circuit}}: ఎలక్ట్రికల్ సర్క్యూట్ డయాగ్రములు వగైరా.',
				value: 'circuit'
			}, {
				label: '{{Should be SVG|coat of arms}}: కోట్ ఆఫ్ ఆర్మ్స్',
				value: 'coat of arms'
			}, {
				label: '{{Should be SVG|diagram}}: వేరే ఏ ఉపవర్గం లోనూ ఇమడని చిత్రాలు',
				value: 'diagram'
			}, {
				label: '{{Should be SVG|emblem}}: చిహ్నాలు, లోగోలు, వగైరా.',
				value: 'emblem'
			}, {
				label: '{{Should be SVG|fair use}}: సముచిత వినియోగ బొమ్మలు,లోగోలు వగైరా',
				value: 'fair use'
			}, {
				label: '{{Should be SVG|flag}}: జండాలు',
				value: 'flag'
			}, {
				label: '{{Should be SVG|graph}}: డేటాను చూపించే చిత్రాలు ',
				value: 'graph'
			}, {
				label: '{{Should be SVG|logo}}: లోగోలు',
				value: 'logo'
			}, {
				label: '{{Should be SVG|map}}: మ్యాపులు',
				value: 'map'
			}, {
				label: '{{Should be SVG|music}}: సంగీత స్వరలిపి వగైరా.',
				value: 'music'
			}, {
				label: '{{Should be SVG|physical}}: "వాస్తవంగా" కనిపించే వస్తువులు, వ్యక్తులు వగైరాల బొమ్మలు.',
				value: 'physical'
			}, {
				label: '{{Should be SVG|symbol}}: ఇతర చిహ్నాలు, ఐకన్లు వగైరా.',
				value: 'symbol'
			}]
		}
	}, {
		label: '{{Should be text}}: బొమ్మను పాఠ్యం గానో, పట్టికలు గానో, మాథ్ మార్కప్ గానో చూపించాలి',
		value: 'Should be text'
	}, {
		label: '{{Split media}}: ఎక్కుంపుల చిట్టాలో రెండు వేరువేరు బొమ్మలు ఉన్నాయి. వీటిని విడదీయాలి',
		value: 'Split media'
	}];

	Twinkle.tag.file.qualityList = [{
		label: '{{Image-blownout}}',
		value: 'Image-blownout'
	}, {
		label: '{{Image-out-of-focus}}',
		value: 'Image-out-of-focus'
	}, {
		label: '{{Image-Poor-Quality}}',
		value: 'Image-Poor-Quality'
	}, {
		label: '{{Image-underexposure}}',
		value: 'Image-underexposure'
	}, {
		label: '{{Low quality chem}}: వివాదాస్పద రసాయనిక ఆకృతులు',
		value: 'Low quality chem'
	}];

	Twinkle.tag.file.replacementList = [{
		label: '{{Duplicate}}: వేరే దస్త్రానికి అచ్చమైన నకలు, అయితే ఇంకా అనాథ కాలేదు',
		value: 'Duplicate'
	}, {
		label: '{{Obsolete}}: మెరుగైన కూర్పు ఉంది',
		value: 'Obsolete'
	}, {
		label: '{{PNG version available}}',
		value: 'PNG version available'
	}, {
		label: '{{SVG version available}}',
		value: 'SVG version available'
	}];


	// Contains those article tags that *do not* work inside {{multiple issues}}.
	Twinkle.tag.multipleIssuesExceptions = [
		'cat improve',
		'copypaste',
		'expand language',
		'GOCEinuse',
		'in use',
		'merge',
		'merge from',
		'merge to',
		'new unreviewed article',
		'not English',
		'rough translation',
		'uncategorized',
		'under construction',
		'update'
	];


	Twinkle.tag.callbacks = {
		main: function(pageobj) {
			var params = pageobj.getCallbackParameters(),
				tagRe, tagText = '',
				summaryText = 'Added',
				tags = [],
				groupableTags = [],
				i, totalTags;

			// Remove tags that become superfluous with this action
			var pageText = pageobj.getPageText().replace(/\{\{\s*(New unreviewed article|Userspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");

			var addTag = function friendlytagAddTag(tagIndex, tagName) {
				var currentTag = "";
				if (tagName === 'uncategorized' || tagName === 'cat improve') {
					pageText += '\n\n{{' + tagName +
						'|date={{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}}}';
				} else {
					if (tagName === 'globalize') {
						currentTag += '{{' + params.globalizeSubcategory;
					} else {
						currentTag += (Twinkle.tag.mode === 'redirect' ? '\n' : '') + '{{' + tagName;
					}

					if (tagName === 'notability' && params.notabilitySubcategory !== 'none') {
						currentTag += '|' + params.notabilitySubcategory;
					}

					// prompt for other parameters, based on the tag
					switch (tagName) {
						case 'cleanup':
							var reason = prompt('వ్యాసానికి శుద్ధి ఎందుకు అవసరమో మరింత నిర్దుష్టమైన కారణం ఇవ్వండి.  \n' +
								"ఈ సమాచారం ఆవశ్యకం. {{cleanup}} ట్యాగును వదిలేసేందుకు రద్దుచెయ్యి నొక్కండి.", "");
							if (reason === null || reason === "") {
								Morebits.status.warn("గమనిక", "వాడుకరి {{cleanup}} ట్యాగును వదిలేసారు");
								return true; // continue to next tag
							} else {
								currentTag += '|reason=' + reason;
							}
							break;
						case 'copy edit':
							var cereason = prompt('"ఈ పని సాధించేందుకు, ఈ వ్యాసంలో కాపీ ఎడిట్ చెయ్యాల్సి ఉంది:"  (ఉదా: "అక్షర దోషాలను సరిచెయ్యడం")  \n' +
								"దీన్ని ఇవ్వదలచకపోతే OK నొక్కండి. {{copy edit}} ట్యాగును వదిలెయ్యాలనుకుంటే, రద్దుచెయ్యి నొక్కండి..", "");
							if (cereason === null) {
								return true; // continue to next tag
							} else if (cereason !== "") {
								currentTag += '|for=' + cereason;
							}
							break;
						case 'copypaste':
							var url = prompt('కాపీ ఎక్కడి నుండి చేసారని భావిస్తున్నారో, దాని  URL ఇవ్వండి .  \n' +
								"మీకు తెలియక పోతే OK నొక్కండి. {{copypaste}} ట్యాగును వదిలెయ్యాలనుకుంటే, రద్దుచెయ్యి నొక్కండి.", "");
							if (url === null) {
								return true; // continue to next tag
							} else if (url !== "") {
								currentTag += '|url=' + url;
							}
							break;
						case 'expand language':
							currentTag += '|topic=';
							var langcode = prompt('వేరే వికీ భాష కోడును ఇవ్వండి (ఉదా. "kn").  \n' +
								"ఈ సమాచారం తప్పనిసరి. {{expand language}} ట్యాగును వదిలెయ్యాలనుకుంటే రద్దుచెయ్యి నొక్కండి.", "");
							if (langcode === null || langcode === "") {
								Morebits.status.warn("గమనిక", "వాడుకరి {{expand language}} ట్యాగును వదిలేసారు");
								return true; // continue to next tag
							} else {
								currentTag += '|langcode=' + langcode;
							}
							var otherart = prompt('వేరే వికీ లోని వ్యాసం పేరు ఇవ్వండి (అంతర్వికీ ఆదిపదం లేకుండా).  \n' +
								"ఈ సమాచారం ఐచ్ఛికం. {{expand language}} ట్యాగును వదిలెయ్యాలనుకుంటే, రద్దుచెయ్యి నొక్కండి.", "");
							if (otherart === null) {
								Morebits.status.warn("గమనిక", "వాడుకరి {{expand language}} ట్యాగును వదిలేసారు");
								return true; // continue to next tag
							} else {
								currentTag += '|otherarticle=' + otherart;
							}
							break;
						case 'expert-subject':
							var wikiproject = prompt('Please enter the name of a WikiProject which might be able to help recruit an expert.  \n' +
								"Just click OK if you don't know.  To skip the {{expert-subject}} tag, click Cancel.", "");
							if (wikiproject === null) {
								return true; // continue to next tag
							} else if (wikiproject !== "") {
								currentTag += '|1=' + wikiproject;
							}
							break;
						case 'not English':
							var langname = prompt('వ్యాసం ఏ భాషలో ఉందో ఇవ్వండి .  \n' +
								"తెలియకపోతే OK నొక్కండి. {{తెలుగు కాదు}} ట్యాగును వదిలెయ్యాలంటే, రద్దుచెయ్యి నొక్కండి.", "");
							if (langname === null) {
								return true; // continue to next tag
							} else if (langname !== "") {
								currentTag += '|1=' + langname;
							}
							break;
						case 'rough translation':
							var roughlang = prompt('వ్యాసాన్ని ఏ భాషలోని వ్యాసానికి అనువాదమని భావిస్తున్నారో, ఆ భాష పేరు ఇవ్వండి.  \n' +
								"తెలియకపోతే OK నొక్కండి. {{rough translation}} ట్యాగును వదిలెయ్యాలంటే, రద్దుచెయ్యి నొక్కండి.", "");
							if (roughlang === null) {
								return true; // continue to next tag
							} else if (roughlang !== "") {
								currentTag += '|1=' + roughlang;
							}
							break;
						case 'merge':
						case 'merge to':
						case 'merge from':
							var param = prompt('విలీనంలో పాలుపంచుకునే ఇతర వ్యాసాల పేర్లు ఇవ్వండి.  \n' +
								"ఒకటి కంటే ఎక్కువ వ్యాసాల పేర్లు ఇస్తే, పేర్ల మధ్య పైపు (|) పెట్టండి.  \n" +
								"ఈ సమాచారం ఆవశ్యకం. ఇచ్చాక, OK నొక్కండి. విలీనం ట్యాగును వదిలెయ్యదలిస్తే, రద్దుచెయ్యి నొక్కండి.", "");
							if (param === null) {
								return true; // continue to next tag
							} else if (param !== "") {
								currentTag += '|' + param;
							}
							break;
						default:
							break;
					}

					currentTag += (Twinkle.tag.mode === 'redirect') ? '}}' : '|date={{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}}}\n';
					tagText += currentTag;
				}

				if (tagIndex > 0) {
					if (tagIndex === (totalTags - 1)) {
						summaryText += ',';
					} else if (tagIndex < (totalTags - 1)) {
						summaryText += ',';
					}
				}

				summaryText += ' {{[[';
				if (tagName === 'globalize') {
					summaryText += "మూస:" + params.globalizeSubcategory + '|' + params.globalizeSubcategory;
				} else {
					summaryText += (tagName.indexOf(":") !== -1 ? tagName : ("మూస:" + tagName + "|" + tagName));
				}
				summaryText += ']]}}';
			};

			if (Twinkle.tag.mode !== 'redirect') {
				// Check for preexisting tags and separate tags into groupable and non-groupable arrays
				for (i = 0; i < params.tags.length; i++) {
					tagRe = new RegExp('(\\{\\{' + params.tags[i] + '(\\||\\}\\})|\\|\\s*' + params.tags[i] + '\\s*=[a-z ]+\\d+)', 'im');
					if (!tagRe.exec(pageText)) {
						if (Twinkle.tag.multipleIssuesExceptions.indexOf(params.tags[i]) === -1) {
							groupableTags = groupableTags.concat(params.tags[i]);
						} else {
							tags = tags.concat(params.tags[i]);
						}
					} else {
						Morebits.status.warn('Info', 'వ్యాసంలో ఈసరికే {{' + params.tags[i] +
							'}} ఉంది...వదిలేస్తున్నాం');
					}
				}

				var miTest = /\{\{(multiple ?issues|article ?issues|mi)[^}]+\{/im.exec(pageText);
				var miOldStyleRegex = /\{\{(multiple ?issues|article ?issues|mi)\s*\|([^{]+)\}\}/im;
				var miOldStyleTest = miOldStyleRegex.exec(pageText);

				if ((miTest || miOldStyleTest) && groupableTags.length > 0) {
					Morebits.status.info('Info', 'ఇప్పటికే ఉన్న {{multiple issues}} ట్యాగు లోపల వీలున్న ట్యాగులను చేరుస్తున్నాం');

					groupableTags.sort();
					tagText = "";

					totalTags = groupableTags.length;
					$.each(groupableTags, addTag);

					summaryText += ' tag' + (groupableTags.length > 1 ? 's' : '') + ' (within {{[[మూస:multiple issues|multiple issues]]}})';
					if (tags.length > 0) {
						summaryText += ',';
					}

					if (miOldStyleTest) {
						// convert tags from old-style to new-style
						var split = miOldStyleTest[2].split("|");
						$.each(split, function(index, val) {
							split[index] = val.replace("=", "|date=").trim();
						});
						pageText = pageText.replace(miOldStyleRegex, "{{$1|\n{{" + split.join("}}\n{{") + "}}\n" + tagText + "}}\n");
					} else {
						var miRegex = new RegExp("(\\{\\{\\s*" + miTest[1] + "\\s*(?:\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?)\\}\\}\\s*", "im");
						pageText = pageText.replace(miRegex, "$1" + tagText + "}}\n");
					}
					tagText = "";
				} else if (params.group && groupableTags.length >= 3) {
					Morebits.status.info('Info', '{{multiple issues}} ట్యాగు లోపల వీలున్న ట్యాగులను గుదిగుచ్చి పెడుతున్నాం');

					groupableTags.sort();
					tagText += '{{multiple issues|\n';

					totalTags = groupableTags.length;
					$.each(groupableTags, addTag);

					summaryText += ' tags (within {{[[మూస:multiple issues|multiple issues]]}})';
					if (tags.length > 0) {
						summaryText += ',';
					}
					tagText += '}}\n';
				} else {
					tags = tags.concat(groupableTags);
				}
			} else {
				// Redirect tagging: Check for pre-existing tags
				for (i = 0; i < params.tags.length; i++) {
					tagRe = new RegExp('(\\{\\{' + params.tags[i] + '(\\||\\}\\}))', 'im');
					if (!tagRe.exec(pageText)) {
						tags = tags.concat(params.tags[i]);
					} else {
						Morebits.status.warn('Info', 'దారిమార్పు పేజీలో ఈసరికే {{' + params.tags[i] +
							'}} ఉంది...వదిలేస్తున్నాం');
					}
				}
			}

			tags.sort();
			totalTags = tags.length;
			$.each(tags, addTag);

			if (Twinkle.tag.mode === 'redirect') {
				pageText += tagText;
			} else {
				// smartly insert the new tags after any hatnotes. Regex is a bit more
				// complicated than it'd need to be, to allow templates as parameters,
				// and to handle whitespace properly.
				pageText = pageText.replace(/^\s*(?:((?:\s*\{\{\s*(?:about|correct title|dablink|distinguish|for|other\s?(?:hurricaneuses|people|persons|places|uses(?:of)?)|redirect(?:-acronym)?|see\s?(?:also|wiktionary)|selfref|the)\d*\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\})+(?:\s*\n)?)\s*)?/i,
					"$1" + tagText);
			}
			summaryText += (tags.length > 0 ? ' tag' + (tags.length > 1 ? 's' : '') : '') +
				' to ' + Twinkle.tag.mode;

			// avoid truncated summaries
			if (summaryText.length > (254 - Twinkle.getPref('summaryAd').length)) {
				summaryText = summaryText.replace(/\[\[[^\|]+\|([^\]]+)\]\]/g, "$1");
			}

			pageobj.setPageText(pageText);
			pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
			pageobj.setWatchlist(Twinkle.getFriendlyPref('watchTaggedPages'));
			pageobj.setMinorEdit(Twinkle.getFriendlyPref('markTaggedPagesAsMinor'));
			pageobj.setCreateOption('nocreate');
			pageobj.save();

			if (Twinkle.getFriendlyPref('markTaggedPagesAsPatrolled')) {
				pageobj.patrol();
			}
		},

		file: function friendlytagCallbacksFile(pageobj) {
			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();
			var summary = "చేరుస్తున్నాం.. ";

			// Add maintenance tags
			if (params.tags.length) {

				var tagtext = "",
					currentTag;
				$.each(params.tags, function(k, tag) {
					// when other commons-related tags are placed, remove "move to Commons" tag
					if (["Keep local", "subst:ncd", "Do not move to Commons_reason", "Do not move to Commons",
							"Now Commons"
						].indexOf(tag) !== -1) {
						text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, "");
					}
					if (tag === "SVG version available") {
						text = text.replace(/\{\{((convert to |convertto|should be |shouldbe|to)?svg|badpng|vectorize)[^}]*\}\}/gi, "");
					}

					currentTag = "{{" + (tag === "Do not move to Commons_reason" ? "Do not move to Commons" : tag);

					var input;
					switch (tag) {
						case "subst:ncd":
							/* falls through */
						case "Keep local":
							input = prompt("{{" + (tag === "subst:ncd" ? "Now Commons" : tag) +
								"}} - కామన్సు లోని బొమ్మ పేరు ఇవ్వండి (స్థానిక పేరు కంటే భిన్నంగా ఉంటే). దస్త్రం: అనే ఆదిపదం లేకుండా ఇవ్వండి:", "");
							if (input === null) {
								return true; // continue
							} else if (input !== "") {
								currentTag += '|1=' + input;
							}
							break;
						case "Rename media":
							input = prompt("{{Rename media}} - బొమ్మకు కొత్త పేరు ఇవ్వండి (ఐచ్ఛికం):", "");
							if (input === null) {
								return true; // continue
							} else if (input !== "") {
								currentTag += "|1=" + input;
							}
							input = prompt("{{Rename media}} - పేరుమార్పుకు కారణం ఇవ్వండి (ఐచ్ఛికం):", "");
							if (input === null) {
								return true; // continue
							} else if (input !== "") {
								currentTag += "|2=" + input;
							}
							break;
						case "Cleanup image":
							/* falls through */
						case "Cleanup SVG":
							input = prompt("{{" + tag + "}} - శుద్ధికి కారణం ఇవ్వండి (తప్పనిసరి). ఈ ట్యాగును వదిలెయ్యదలిస్తే రద్దుచెయ్యి నొక్కండి:", "");
							if (input === null) {
								return true; // continue
							} else if (input !== "") {
								currentTag += "|1=" + input;
							}
							break;
						case "Image-Poor-Quality":
							input = prompt("{{Image-Poor-Quality}} - ఈ బొమ్మ ఎందుకు బాగోలేదో కారణం ఇవ్వండి (తప్పనిసరి). ఈ ట్యాగును వదిలెయ్యదలిస్తే రద్దుచెయ్యి నొక్కండి:", "");
							if (input === null) {
								return true; // continue
							} else if (input !== "") {
								currentTag += "|1=" + input;
							}
							break;
						case "Low quality chem":
							input = prompt("{{Low quality chem}} - ఈ చిత్రం ఎందుకు వివాదాస్పదమో కారణం ఇవ్వండి (తప్పనిసరి). ఈ ట్యాగును వదిలెయ్యదలిస్తే రద్దుచెయ్యి నొక్కండి:", "");
							if (input === null) {
								return true; // continue
							} else if (input !== "") {
								currentTag += "|1=" + input;
							}
							break;
						case "PNG version available":
							/* falls through */
						case "SVG version available":
							/* falls through */
						case "Obsolete":
							/* falls through */
						case "Duplicate":
							input = prompt("{{" + tag + "}} - దీని స్థానంలో ఎక్కించే దస్త్రం పేరు ఇవ్వండి (తప్పనిసరి). ఈ ట్యాగును వదిలెయ్యదలిస్తే రద్దుచెయ్యి నొక్కండి:", "");
							if (input === null) {
								return true; // continue
							} else if (input !== "") {
								currentTag += "|1=" + input;
							}
							break;
						case "Do not move to Commons_reason":
							input = prompt("{{Do not move to Commons}} - ఈ బొమ్మను కామన్సుకు ఎందుకు తరలించరాదో కారణం ఇవ్వండి (తప్పనిసరి). ఈ ట్యాగును వదిలెయ్యదలిస్తే రద్దుచెయ్యి నొక్కండి:", "");
							if (input === null) {
								return true; // continue
							} else if (input !== "") {
								currentTag += "|reason=" + input;
							}
							break;
						case "Non-free reduced":
							//remove {{non-free reduce}} and redirects
							text = text.replace(/\{\{\s*(Template\s*:\s*)?(Non-free reduce|FairUseReduce|Fairusereduce|Fair Use Reduce|Fair use reduce|Reduce size|Reduce|Fair-use reduce|Image-toobig|Comic-ovrsize-img|Non-free-reduce|Nfr|Smaller image|Nonfree reduce)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");
							currentTag += "|date={{subst:date}}";
							break;
						case "Copy to Commons":
							currentTag += "|human=" + mw.config.get("wgUserName");
							break;
						default:
							break; // don't care
					}

					if (tag === "Should be SVG") {
						currentTag += "|" + params.svgSubcategory;
					}

					currentTag += "}}\n";

					tagtext += currentTag;
					summary += "{{" + tag + "}}, ";

					return true; // continue
				});

				if (!tagtext) {
					pageobj.getStatusElement().warn("వాడుకరి ఈ పనిని రద్దుచేసారు; ఇక చెయ్యాల్సిందేమీ లేదు");
					return;
				}

				text = tagtext + text;
			}

			pageobj.setPageText(text);
			pageobj.setEditSummary(summary.substring(0, summary.length - 2) + Twinkle.getPref('summaryAd'));
			pageobj.setWatchlist(Twinkle.getFriendlyPref('watchTaggedPages'));
			pageobj.setMinorEdit(Twinkle.getFriendlyPref('markTaggedPagesAsMinor'));
			pageobj.setCreateOption('nocreate');
			pageobj.save();

			if (Twinkle.getFriendlyPref('markTaggedPagesAsPatrolled')) {
				pageobj.patrol();
			}
		}
	};

	Twinkle.tag.callback.evaluate = function friendlytagCallbackEvaluate(e) {
		var form = e.target;
		var params = {};

		switch (Twinkle.tag.mode) {
			case 'article':
				params.tags = form.getChecked('articleTags');
				params.group = form.group.checked;
				params.globalizeSubcategory = form["articleTags.globalize"] ? form["articleTags.globalize"].value : null;
				params.notabilitySubcategory = form["articleTags.notability"] ? form["articleTags.notability"].value : null;
				break;
			case 'file':
				params.svgSubcategory = form["imageTags.svgCategory"] ? form["imageTags.svgCategory"].value : null;
				params.tags = form.getChecked('imageTags');
				break;
			case 'redirect':
				params.tags = form.getChecked('redirectTags');
				break;
			default:
				alert("Twinkle.tag: unknown mode " + Twinkle.tag.mode);
				break;
		}

		if (!params.tags.length) {
			alert('కనీసం ఒక్క ట్యాగునైనా ఎంచుకోవాలి!');
			return;
		}

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(form);

		Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
		Morebits.wiki.actionCompleted.notice = "ట్యాగులు పెట్టడం పూర్తయింది. వ్యాసాన్ని కొద్ది సెకండ్లలో తిరిగి లోడు చేస్తాం";
		if (Twinkle.tag.mode === 'redirect') {
			Morebits.wiki.actionCompleted.followRedirect = false;
		}

		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "Tagging " + Twinkle.tag.mode);
		wikipedia_page.setCallbackParameters(params);
		switch (Twinkle.tag.mode) {
			case 'article':
				/* falls through */
			case 'redirect':
				wikipedia_page.load(Twinkle.tag.callbacks.main);
				return;
			case 'file':
				wikipedia_page.load(Twinkle.tag.callbacks.file);
				return;
			default:
				alert("Twinkle.tag: unknown mode " + Twinkle.tag.mode);
				break;
		}
	};

	/*
	 ****************************************
	 *** friendlytalkback.js: Talkback module
	 ****************************************
	 * Mode of invocation:     Tab ("TB")
	 * Active on:              Existing user talk pages
	 * Config directives in:   FriendlyConfig
	 */
	;
	(function() {

		Twinkle.talkback = function() {

			if (Morebits.getPageAssociatedUser() === false) {
				return;
			}

			twAddPortletLink(callback, "TB", "friendly-talkback", "Easy talkback");
		};

		var callback = function() {
			if (Morebits.getPageAssociatedUser() === mw.config.get("wgUserName") && !confirm("Is it really so bad that you're talking back to yourself?")) {
				return;
			}

			var Window = new Morebits.simpleWindow(600, 350);
			Window.setTitle("Talkback");
			Window.setScriptName("ట్వింకిల్");
			Window.addFooterLink("{{Talkback}} గురించి", "మూస:Talkback");
			Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#talkback");

			var form = new Morebits.quickForm(callback_evaluate);

			form.append({
				type: "radio",
				name: "tbtarget",
				list: [{
					label: "ప్రత్యుత్తరం: నా చర్చా పేజీలో",
					value: "mytalk",
					checked: "true"
				}, {
					label: "ప్రత్యుత్తరం: అవతలి సభ్యుని చర్చా పేజీలో",
					value: "usertalk"
				}, {
					label: "ప్రత్యుత్తరం: మరేదైనా పేజీలో",
					value: "other"
				}, {
					label: "నోటీసుబోర్డులో గమనింపు",
					value: "notice"
				}, {
					label: "\"మీకు మెయిలొచ్చింది\"",
					value: "mail"
				}],
				event: callback_change_target
			});

			form.append({
				type: "field",
				label: "Work area",
				name: "work_area"
			});

			form.append({
				type: "submit"
			});

			var result = form.render();
			Window.setContent(result);
			Window.display();

			// We must init the
			var evt = document.createEvent("Event");
			evt.initEvent("change", true, true);
			result.tbtarget[0].dispatchEvent(evt);
		};

		var prev_page = "";
		var prev_section = "";
		var prev_message = "";

		var callback_change_target = function(e) {
			var value = e.target.values;
			var root = e.target.form;
			var old_area = Morebits.quickForm.getElements(root, "work_area")[0];

			if (root.section) {
				prev_section = root.section.value;
			}
			if (root.message) {
				prev_message = root.message.value;
			}
			if (root.page) {
				prev_page = root.page.value;
			}

			var work_area = new Morebits.quickForm.element({
				type: "field",
				label: "టాక్‌బ్యాక్ సమాచారం",
				name: "work_area"
			});

			switch (value) {
				case "mytalk":
					/* falls through */
				default:
					work_area.append({
						type: "input",
						name: "section",
						label: "లింకులో చేరుస్తున్న విభాగం (తప్పనిసరి కాదు)",
						tooltip: "మీ చర్చ పేజీలో మీరు సందేశం పెట్టిన విభాగం పేరు. విభాగానికి లింకు పెట్టాల్సిన అవసరం లేకపోతే, ఖాళీగా వదిలెయ్యండి.",
						value: prev_section
					});
					break;
				case "usertalk":
					work_area.append({
						type: "input",
						name: "page",
						label: "వాడుకరి",
						tooltip: "మీరు ఏ వాడుకరి చర్చ పేజీలో సందేశం పెట్టారో ఆ వాడుకరిపేరు.",
						value: prev_page
					});

					work_area.append({
						type: "input",
						name: "section",
						label: "లింకు ఇచ్చిన విభాగం (ఐచ్ఛికం)",
						tooltip: "మీరు సందేశం పెట్టిన విభాగం పేరు. విభాగానికి లింకు పెట్టాల్సిన అవసరం లేకపోతే ఖాళీగా వదిలెయ్యండి.",
						value: prev_section
					});
					break;
				case "notice":
					var noticeboard = work_area.append({
						type: "select",
						name: "noticeboard",
						label: "నోటీసుబోర్డు:"
					});
					noticeboard.append({
						type: "option",
						label: "WP:AN (నిర్వాహకుల నోటీసుబోర్డు)",
						value: "an"
					});
					noticeboard.append({
						type: "option",
						label: "WP:AN3 (నిర్వాహకుల నోటీసుబోర్డు)",
						selected: true,
						value: "an3"
					});
					noticeboard.append({
						type: "option",
						label: "WP:ANI (నిర్వాహకుల నోటీసుబోర్డు)",
						selected: true,
						value: "ani"
					});
					noticeboard.append({
						type: "option",
						label: "WP:COIN (Conflict of interest noticeboard)",
						value: "coin"
					});
					noticeboard.append({
						type: "option",
						label: "WP:DRN (Dispute resolution noticeboard)",
						value: "drn"
					});
					noticeboard.append({
						type: "option",
						label: "WP:HD (Help desk)",
						value: "hd"
					});
					noticeboard.append({
						type: "option",
						label: "WP:THQ (Teahouse question forum)",
						value: "th"
					});
					work_area.append({
						type: "input",
						name: "section",
						label: "Linked thread",
						tooltip: "The heading of the relevant thread on the noticeboard page.",
						value: prev_section
					});
					break;
				case "other":
					work_area.append({
						type: "input",
						name: "page",
						label: "పూర్తి పేజీ పేరు",
						tooltip: "మీరు సందేశం పెట్టిన పేజీ పూర్తి పేరు. ఉదాహరణకు: 'వికీపీడియా చర్చ:ట్వింకిల్'.",
						value: prev_page
					});

					work_area.append({
						type: "input",
						name: "section",
						label: "లింకు ఇచ్చిన విభాగం (ఐచ్ఛికం)",
						tooltip: "పేజీలో మీరు సందేశం పెట్టిన విభాగం పేరు. విభాగానికి లింకు పెట్టాల్సిన అవసరం లేకపోతే ఖాళీగా వదిలెయ్యండి.",
						value: prev_section
					});
					break;
				case "mail":
					work_area.append({
						type: "input",
						name: "section",
						label: "ఈమెయిలు విషయం (ఐచ్ఛికం)",
						tooltip: "మీరు పంపిన ఈమెయిలు లోని విషయం."
					});
					break;
			}

			if (value !== "notice") {
				work_area.append({
					type: "textarea",
					label: "అదనపు సమాచారం (ఐచ్ఛికం):",
					name: "message",
					tooltip: "An additional message that you would like to leave below the talkback template. Your signature will be added to the end of the message if you leave one."
				});
			}

			work_area = work_area.render();
			root.replaceChild(work_area, old_area);
			if (root.message) {
				root.message.value = prev_message;
			}
		};

		var callback_evaluate = function(e) {

			var tbtarget = e.target.getChecked("tbtarget")[0];
			var page = null;
			var section = e.target.section.value;
			var fullUserTalkPageName = mw.config.get("wgFormattedNamespaces")[mw.config.get("wgNamespaceIds").user_talk] + ":" + Morebits.getPageAssociatedUser();

			if (tbtarget === "usertalk" || tbtarget === "other") {
				page = e.target.page.value;

				if (tbtarget === "usertalk") {
					if (!page) {
						alert("మీరు ఏ వాడుకరి చర్చ పేజీలో సందేశం పెట్టారో ఆ వాడుకరిపేరును ఇవ్వాలి.");
						return;
					}
				} else {
					if (!page) {
						alert("మీరు సందేశం పెట్టేది వాడుకరి చర్చ పేజీలో కాకపోతే, పూర్తి పేజీ పేరు ఇవ్వాలి.");
						return;
					}
				}
			} else if (tbtarget === "notice") {
				page = e.target.noticeboard.value;
			}

			var message;
			if (e.target.message) {
				message = e.target.message.value;
			}

			Morebits.simpleWindow.setButtonsEnabled(false);
			Morebits.status.init(e.target);

			Morebits.wiki.actionCompleted.redirect = fullUserTalkPageName;
			Morebits.wiki.actionCompleted.notice = "సందేశం ఇవ్వటం పూర్తయింది. చర్చాపేజీ కొద్ది సెకన్లలో రీలోడు ఔతుంది";

			var talkpage = new Morebits.wiki.page(fullUserTalkPageName, "Adding talkback");
			var tbPageName = (tbtarget === "mytalk") ? mw.config.get("wgUserName") : page;

			var text;
			if (tbtarget === "notice") {
				switch (page) {
					case "an":
						text = "\n\n== " + Twinkle.getFriendlyPref("adminNoticeHeading") + " ==\n";
						text += "{{subst:ANI-notice|thread=" + section + "|noticeboard=వికీపీడియా:నిర్వాహకుల నోటీసుబోర్డు}} ~~~~";
						talkpage.setEditSummary("Notice of discussion at [[వికీపీడియా:నిర్వాహకుల నోటీసుబోర్డు]]" + Twinkle.getPref("summaryAd"));
						break;
					case "an3":
						text = "\n\n{{subst:An3-notice|" + section + "}} ~~~~";
						talkpage.setEditSummary("Notice of discussion at [[వికీపీడియా:నిర్వాహకుల నోటీసుబోర్డు/Edit warring]]" + Twinkle.getPref("summaryAd"));
						break;
					case "ani":
						text = "\n\n== " + Twinkle.getFriendlyPref("adminNoticeHeading") + " ==\n";
						text += "{{subst:ANI-notice|thread=" + section + "|noticeboard=వికీపీడియా:నిర్వాహకుల నోటీసుబోర్డు/Incidents}} ~~~~";
						talkpage.setEditSummary("Notice of discussion at [[వికీపీడియా:నిర్వాహకుల నోటీసుబోర్డు/Incidents]]" + Twinkle.getPref("summaryAd"));
						break;
					case "coin":
						text = "\n\n{{subst:Coin-notice|thread=" + section + "}} ~~~~";
						talkpage.setEditSummary("Notice of discussion at [[వికీపీడియా:Conflict of interest noticeboard]]" + Twinkle.getPref("summaryAd"));
						break;
					case "drn":
						text = "\n\n{{subst:DRN-notice|thread=" + section + "}} ~~~~";
						talkpage.setEditSummary("Notice of discussion at [[వికీపీడియా:Dispute resolution noticeboard]]" + Twinkle.getPref("summaryAd"));
						break;
					case "hd":
						text = "\n\n== Your question at the Help desk ==\n";
						text += "{{helpdeskreply|1=" + section + "|ts=~~~~~}}";
						talkpage.setEditSummary("You have replies at the [[వికీపీడియా:Help desk|Wikipedia help desk]]" + Twinkle.getPref("summaryAd"));
						break;
					case "th":
						text = "\n\n{{WP:Teahouse/Teahouse talkback|WP:Teahouse/Questions|" + section + "|ts=~~~~}}";
						talkpage.setEditSummary("You have replies at the [[వికీపీడియా:Teahouse/Questions|Teahouse question board]]" + Twinkle.getPref("summaryAd"));
						break;
					default:
						throw "Twinkle.talkback, function callback_evaluate: default case reached";
				}

			} else if (tbtarget === "mail") {
				text = "\n\n==" + Twinkle.getFriendlyPref("mailHeading") + "==\n{{you've got mail|subject=";
				text += section + "|ts=~~~~~}}";

				if (message) {
					text += "\n" + message + "  ~~~~";
				} else if (Twinkle.getFriendlyPref("insertTalkbackSignature")) {
					text += "\n~~~~";
				}

				talkpage.setEditSummary("గమనింపు: మీకు మెయిలొచ్చింది" + Twinkle.getPref("summaryAd"));

			} else {
				//clean talkback heading: strip section header markers, were erroneously suggested in the documentation
				text = "\n\n==" + Twinkle.getFriendlyPref("talkbackHeading").replace(/^\s*=+\s*(.*?)\s*=+$\s*/, "$1") + "==\n{{talkback|";
				text += tbPageName;

				if (section) {
					text += "|" + section;
				}

				text += "|ts=~~~~~}}";

				if (message) {
					text += "\n" + message + "  ~~~~";
				} else if (Twinkle.getFriendlyPref("insertTalkbackSignature")) {
					text += "\n~~~~";
				}

				talkpage.setEditSummary("Talkback ([[" + (tbtarget === "other" ? "" : "User talk:") + tbPageName +
					(section ? ("#" + section) : "") + "]])" + Twinkle.getPref("summaryAd"));
			}

			talkpage.setAppendText(text);
			talkpage.setCreateOption("recreate");
			talkpage.setMinorEdit(Twinkle.getFriendlyPref("markTalkbackAsMinor"));
			talkpage.setFollowRedirect(true);
			talkpage.append();
		};

	}());

	/*
	 ****************************************
	 *** friendlywelcome.js: Welcome module
	 ****************************************
	 * Mode of invocation:     Tab ("Wel"), or from links on diff pages
	 * Active on:              Existing user talk pages, diff pages
	 * Config directives in:   FriendlyConfig
	 */

	Twinkle.welcome = function friendlywelcome() {
		if (Morebits.queryString.exists('friendlywelcome')) {
			if (Morebits.queryString.get('friendlywelcome') === 'auto') {
				Twinkle.welcome.auto();
			} else {
				Twinkle.welcome.semiauto();
			}
		} else {
			Twinkle.welcome.normal();
		}
	};

	Twinkle.welcome.auto = function() {
		if (Morebits.queryString.get('action') !== 'edit') {
			// userpage not empty, aborting auto-welcome
			return;
		}

		Twinkle.welcome.welcomeUser();
	};

	Twinkle.welcome.semiauto = function() {
		Twinkle.welcome.callback(mw.config.get('wgTitle').split('/')[0].replace(/\"/, "\\\""));
	};

	Twinkle.welcome.normal = function() {
		if (Morebits.queryString.exists('diff')) {
			// check whether the contributors' talk pages exist yet
			var $oList = $("#mw-diff-otitle2").find("span.mw-usertoollinks a.new:contains(talk)").first();
			var $nList = $("#mw-diff-ntitle2").find("span.mw-usertoollinks a.new:contains(talk)").first();

			if ($oList.length > 0 || $nList.length > 0) {
				var spanTag = function(color, content) {
					var span = document.createElement('span');
					span.style.color = color;
					span.appendChild(document.createTextNode(content));
					return span;
				};

				var welcomeNode = document.createElement('strong');
				var welcomeLink = document.createElement('a');
				welcomeLink.appendChild(spanTag('Black', '['));
				welcomeLink.appendChild(spanTag('Goldenrod', 'welcome'));
				welcomeLink.appendChild(spanTag('Black', ']'));
				welcomeNode.appendChild(welcomeLink);

				if ($oList.length > 0) {
					var oHref = $oList.attr("href");

					var oWelcomeNode = welcomeNode.cloneNode(true);
					oWelcomeNode.firstChild.setAttribute('href', oHref + '&' + Morebits.queryString.create({
						'friendlywelcome': Twinkle.getFriendlyPref('quickWelcomeMode') === 'auto' ? 'auto' : 'norm'
					}) + '&' + Morebits.queryString.create({
						'vanarticle': mw.config.get('wgPageName').replace(/_/g, ' ')
					}));
					$oList[0].parentNode.parentNode.appendChild(document.createTextNode(' '));
					$oList[0].parentNode.parentNode.appendChild(oWelcomeNode);
				}

				if ($nList.length > 0) {
					var nHref = $nList.attr("href");

					var nWelcomeNode = welcomeNode.cloneNode(true);
					nWelcomeNode.firstChild.setAttribute('href', nHref + '&' + Morebits.queryString.create({
						'friendlywelcome': Twinkle.getFriendlyPref('quickWelcomeMode') === 'auto' ? 'auto' : 'norm'
					}) + '&' + Morebits.queryString.create({
						'vanarticle': mw.config.get('wgPageName').replace(/_/g, ' ')
					}));
					$nList[0].parentNode.parentNode.appendChild(document.createTextNode(' '));
					$nList[0].parentNode.parentNode.appendChild(nWelcomeNode);
				}
			}
		}
		if (mw.config.get('wgNamespaceNumber') === 3) {
			var username = mw.config.get('wgTitle').split('/')[0].replace(/\"/, "\\\""); // only first part before any slashes
			twAddPortletLink(function() {
				Twinkle.welcome.callback(username);
			}, "Wel", "friendly-welcome", "Welcome user");
		}
	};

	Twinkle.welcome.welcomeUser = function welcomeUser() {
		Morebits.status.init(document.getElementById('bodyContent'));

		var params = {
			value: Twinkle.getFriendlyPref('quickWelcomeTemplate'),
			article: Morebits.queryString.exists('vanarticle') ? Morebits.queryString.get('vanarticle') : '',
			mode: 'auto'
		};

		Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
		Morebits.wiki.actionCompleted.notice = "స్వాగతం చెప్పడం పూర్తయింది. చర్చ పేజీని కొద్ది సెకండ్లలో తిరిగి లోడు చేస్తాం";

		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "వాడుకరి చర్చ పేజీ మార్పు");
		wikipedia_page.setFollowRedirect(true);
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.load(Twinkle.welcome.callbacks.main);
	};

	Twinkle.welcome.callback = function friendlywelcomeCallback(uid) {
		if (uid === mw.config.get('wgUserName') && !confirm('Are you really sure you want to welcome yourself?...')) {
			return;
		}

		var Window = new Morebits.simpleWindow(600, 420);
		Window.setTitle("వాడుకరికి స్వాగతం");
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("స్వాగత సంఘం", "WP:WC");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#welcome");

		var form = new Morebits.quickForm(Twinkle.welcome.callback.evaluate);

		form.append({
			type: 'select',
			name: 'type',
			label: 'స్వాగత రకం: ',
			event: Twinkle.welcome.populateWelcomeList,
			list: [{
				type: 'option',
				value: 'standard',
				label: 'ప్రామాణిక స్వాగతాలు',
				selected: !Morebits.isIPAddress(mw.config.get('wgTitle'))
			}, {
				type: 'option',
				value: 'anonymous',
				label: 'ఐపీ వాడుకరి స్వాగతాలు',
				selected: Morebits.isIPAddress(mw.config.get('wgTitle'))
			}, {
				type: 'option',
				value: 'wikiProject',
				label: 'వికీప్రాజెక్టు స్వాగతాలు'
			}, {
				type: 'option',
				value: 'nonEnglish',
				label: 'ఇతర భాషల్లో స్వాగతాలు'
			}]
		});

		form.append({
			type: 'div',
			id: 'welcomeWorkArea'
		});

		form.append({
			type: 'input',
			name: 'article',
			label: '* వ్యాసం లింకు (మూస మద్దతు ఉంటే):',
			value: (Morebits.queryString.exists('vanarticle') ? Morebits.queryString.get('vanarticle') : ''),
			tooltip: 'మూస మద్దతు ఉంటే, స్వాగత సదేశంలో ఏదైనా వ్యాసానికి లింకు ఇవ్వవచ్చు. లింకు ఇవ్వదలచకపోతే ఖాళీగా వదిలెయ్యండి. లింకుకు మద్దతు ఇచ్చే మూసలకు చుక్క గుర్తు ఉంటుంది.'
		});

		var previewlink = document.createElement('a');
		$(previewlink).click(function() {
			Twinkle.welcome.callbacks.preview(result); // |result| is defined below
		});
		previewlink.style.cursor = "pointer";
		previewlink.textContent = 'Preview';
		form.append({
			type: 'div',
			name: 'welcomepreview',
			label: [previewlink]
		});

		form.append({
			type: 'submit'
		});

		var result = form.render();
		Window.setContent(result);
		Window.display();

		// initialize the welcome list
		var evt = document.createEvent("Event");
		evt.initEvent('change', true, true);
		result.type.dispatchEvent(evt);
	};

	Twinkle.welcome.populateWelcomeList = function(e) {
		var type = e.target.value;
		var $workarea = $(e.target.form).find("div#welcomeWorkArea");

		var div = new Morebits.quickForm.element({
			type: "div",
			id: "welcomeWorkArea"
		});

		if ((type === "standard" || type === "anonymous") && Twinkle.getFriendlyPref("customWelcomeList").length) {
			div.append({
				type: 'header',
				label: 'కస్టమ్ స్వాగత మూసలు'
			});
			div.append({
				type: 'radio',
				name: 'template',
				list: Twinkle.getFriendlyPref("customWelcomeList"),
				event: Twinkle.welcome.selectTemplate
			});
		}

		var appendTemplates = function(list) {
			div.append({
				type: 'radio',
				name: 'template',
				list: list.map(function(obj) {
					var properties = Twinkle.welcome.templates[obj];
					var result = (properties ? {
						value: obj,
						label: "{{" + obj + "}}: " + properties.description + (properties.linkedArticle ? "\u00A0*" : ""), // U+00A0 NO-BREAK SPACE
						tooltip: properties.tooltip // may be undefined
					} : {
						value: obj,
						label: "{{" + obj + "}}"
					});
					return result;
				}),
				event: Twinkle.welcome.selectTemplate
			});
		};

		switch (type) {
			case "standard":
				div.append({
					type: 'header',
					label: 'సాధారణ స్వాగత మూసలు'
				});
				appendTemplates([
					"welcome",
					"welcome-short",
					"welcome-personal",
					"welcome-graphical",
					"welcome-menu",
					"welcome-screen",
					"welcome-belated",
					"welcome student",
					"welcome teacher"
				]);
				div.append({
					type: 'header',
					label: 'సమస్యాత్మక వాడుకరి స్వాగత మూసలు'
				});
				appendTemplates([
					"welcomelaws",
					"first article",
					"welcomevandal",
					"welcomenpov",
					"welcomespam",
					"welcomeunsourced",
					"welcomeauto",
					"welcome-COI",
					"welcome-image"
				]);
				break;
			case "anonymous":
				div.append({
					type: 'header',
					label: 'అజ్ఞాత వాడుకరి స్వాగత మూసలు'
				});
				appendTemplates([
					"welcome-anon",
					"welcome-anon-border",
					"welcome-anon-test",
					"welcome-anon-vandal",
					"welcome-anon-constructive"
				]);
				break;
			case "wikiProject":
				div.append({
					type: 'header',
					label: 'వికీప్రాజెక్టులకు చెందిన స్వాగత మూసలు'
				});
				appendTemplates([
					"welcome-au",
					"welcome-bio",
					"welcome-cal",
					"welcome-conserv",
					"welcome-cycling",
					"welcome-dbz",
					"welcome-et",
					"welcome-in",
					"welcome-de",
					"welcome-math",
					"welcome-med",
					"welcome-no",
					"welcome-pk",
					"welcome-phys",
					"welcome-pl",
					"welcome-roads",
					"welcome-rugbyunion",
					"welcome-ru",
					"welcome-starwars",
					"welcome-ch",
					"welcome-uk",
					"welcome-videogames"
				]);
				break;
			case "nonEnglish":
				div.append({
					type: 'header',
					label: 'ఇతర భాషల్లోని స్వాగత మూసలు'
				});
				appendTemplates([
					"welcomeen-sq",
					"welcomeen-zh",
					"welcomeen-nl",
					"welcomeen-fi",
					"welcomeen-fr",
					"welcomeen-de",
					"welcomeen-he",
					"welcomeen-ja",
					"welcomeen-ko",
					"welcomeen-mr",
					"welcomeen-ml",
					"welcomeen-or",
					"welcomeen-pt",
					"welcomeen-ru",
					"welcomeen-es",
					"welcomeen-sv",
					"welcomeen-uk"
				]);
				break;
			default:
				div.append({
					type: 'div',
					label: 'Twinkle.welcome.populateWelcomeList: something went wrong'
				});
				break;
		}

		var rendered = div.render();
		rendered.className = "quickform-scrollbox";
		$workarea.replaceWith(rendered);

		var firstRadio = e.target.form.template[0];
		firstRadio.checked = true;
		Twinkle.welcome.selectTemplate({
			target: firstRadio
		});
	};

	Twinkle.welcome.selectTemplate = function(e) {
		var properties = Twinkle.welcome.templates[e.target.values];
		e.target.form.article.disabled = (properties ? !properties.linkedArticle : false);
	};


	// A list of welcome templates and their properties and syntax

	// The four fields that are available are "description", "linkedArticle", "syntax", and "tooltip".
	// The three magic words that can be used in the "syntax" field are:
	//   - $USERNAME$  - replaced by the welcomer's username, depending on user's preferences
	//   - $ARTICLE$   - replaced by an article name, if "linkedArticle" is true
	//   - $HEADER$    - adds a level 2 header (most templates already include this)

	Twinkle.welcome.templates = {
		"welcome": {
			description: "ప్రామాణిక స్వాగతం",
			linkedArticle: true,
			syntax: "{{subst:welcome|$USERNAME$|art=$ARTICLE$}} ~~~~"
		},
		"welcome-short": {
			description: "చిన్న స్వాగత సందేశం",
			linkedArticle: false,
			syntax: "{{subst:welcome-short|$USERNAME$}} $EXTRA$ ~~~~"
		},
		"welcome-personal": {
			description: "సన్నిహిత వ్యక్తిగత సందేశం, అప్పచ్చులతో సహా",
			linkedArticle: false,
			syntax: "{{subst:welcome-personal|$USERNAME$}} ~~~~"
		},
		"welcome-graphical": {
			description: "ఓ 20 లింకుల పట్టికతో సహా ఒక అందమైన స్వాగత సందేశం",
			linkedArticle: false,
			syntax: "$HEADER$ {{subst:welcome-graphical|$EXTRA$}}"
		},
		"welcome-menu": {
			description: "ఓ 60 లింకులున్న పెద్ద పట్టికతో ఒక స్వాగత సందేశం",
			linkedArticle: false,
			syntax: "$HEADER$ {{subst:welcome-menu}}"
		},
		"welcome-screen": {
			description: "స్పష్టమైన, వివరణలతో కూడిన 10 లింకుల పట్టికతో ఒక స్వాగత సందేశం",
			linkedArticle: false,
			syntax: "$HEADER$ {{subst:welcome-screen}}"
		},
		"welcome-belated": {
			description: "గణనీయంగా తోడ్పడిన వాడుకరులను స్వాగతించే సందేశం",
			linkedArticle: false,
			syntax: "{{subst:welcome-belated|$USERNAME$}}"
		},
		"welcome student": {
			description: "విద్యా ప్రాజెక్టులో భాగంగా దిద్దుబాట్లు చేయవచ్చిన విద్యార్థులకు స్వాగతం",
			linkedArticle: false,
			syntax: "$HEADER$ {{subst:welcome student|$USERNAME$}} ~~~~"
		},
		"welcome teacher": {
			description: "విద్యా ప్రాజెక్టులో భాగంగా ఉన్న ఉపాధ్యాయులకు స్వాగతం",
			linkedArticle: false,
			syntax: "$HEADER$ {{subst:welcome teacher|$USERNAME$}} ~~~~"
		},
		"welcomelaws": {
			description: "కాపీహక్కులు, తటస్థ దృక్కోణం, ప్రయోగశాల, దుశ్చర్యల గురించిన సమాచారంతో స్వాగతం",
			linkedArticle: false,
			syntax: "{{subst:welcomelaws|$USERNAME$}} ~~~~"
		},
		"first article": {
			description: "తమ మొదటి వ్యాసంలో పేజీ సృష్టి మార్గదర్శకాలను పాటించని వాడుకరుల కోసం",
			linkedArticle: true,
			syntax: "{{subst:first article|$ARTICLE$|$USERNAME$}}"
		},
		"welcomevandal": {
			description: "తమ తొలి కృషి దుశ్చర్య లాగా అనిపించిన వాడుకరుల కోసం",
			linkedArticle: true,
			syntax: "{{subst:welcomevandal|$ARTICLE$|$USERNAME$}}"
		},
		"welcomenpov": {
			description: "తమ తొలి కృషిలో తటస్థ దృక్కోణం లోపించిన వారి కోసం",
			linkedArticle: true,
			syntax: "{{subst:welcomenpov|$ARTICLE$|$USERNAME$}} ~~~~"
		},
		"welcomespam": {
			description: "స్పాము వ్యతిరేక విధానాల గురించి మరింతగా వివరిస్తూ స్వాగతం",
			linkedArticle: true,
			syntax: "{{subst:welcomespam|$ARTICLE$|$USERNAME$}} ~~~~"
		},
		"welcomeunsourced": {
			description: "తొలి కృషిలో మూలాల్లేని పాఠ్యం చేర్చిన వాడుకరుల కోసం",
			linkedArticle: true,
			syntax: "{{subst:welcomeunsourced|$ARTICLE$|$USERNAME$}} ~~~~"
		},
		"welcomeauto": {
			description: "తమ గురించే వ్యాసం రాసుకున్న వాడుకరుల కోసం ",
			linkedArticle: true,
			syntax: "{{subst:welcomeauto|$USERNAME$|art=$ARTICLE$}} ~~~~"
		},
		"welcome-COI": {
			description: "తమకు అన్యథా ఆసక్తి ఉన్న రంగాల్లో దిద్దుబాట్లు చేసినవారి కోసం",
			linkedArticle: true,
			syntax: "{{subst:welcome-COI|$USERNAME$|art=$ARTICLE$}} ~~~~"
		},
		"welcome-image": {
			description: "బొమ్మల గురించిన (విధానం, పద్ధతి) అదనపు సమాచారంతో స్వాగతం",
			linkedArticle: true,
			syntax: "{{subst:welcome-image}}"
		},

		// ANONYMOUS USER WELCOMES

		"welcome-anon": {
			description: "అజ్ఞాత వాడుకరులకు; ఖాతా సృష్టించుకొమ్మని ప్రోత్సహిస్తూ",
			linkedArticle: true,
			syntax: "{{subst:welcome-anon|art=$ARTICLE$}} ~~~~"
		},
		"welcome-anon-border": {
			description: "{{welcome-anon}} లాంటిదే, కానీ చుట్టూ అంచుతో, మరింత స్పష్టమైన భాషతో",
			linkedArticle: false,
			syntax: "{{subst:welcome-anon-border}}"
		},
		"welcome-anon-test": {
			description: "పరీక్షా దిద్దుబాట్లు చేసిన అజ్ఞాత వాడుకరుల కోసం",
			linkedArticle: true,
			syntax: "{{subst:welcome-anon-test|$ARTICLE$|$USERNAME$}} ~~~~"
		},
		"welcome-anon-vandal": {
			description: "పేజీలో దుశ్చర్యలు చేసిన అజ్ఞాత వాడుకరుల కోసం",
			linkedArticle: true,
			syntax: "{{subst:welcome-anon-vandal|$ARTICLE$|$USERNAME$}}"
		},
		"welcome-anon-constructive": {
			description: "దుశ్చర్యలను వ్యతిరేకిస్తూ, నిర్మాణాత్మక దిద్దుబాట్లు చేసే అజ్ఞాత వాడుకరుల కోసం",
			linkedArticle: true,
			syntax: "{{subst:welcome-anon-constructive|art=$ARTICLE$}}"
		},

		// WIKIPROJECT-SPECIFIC WELCOMES

		"welcome-au": {
			description: "welcome for users with an apparent interest in Australia topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-au}} ~~~~"
		},
		"welcome-bio": {
			description: "welcome for users with an apparent interest in biographical topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-bio}} ~~~~"
		},
		"welcome-cal": {
			description: "welcome for users with an apparent interest in California topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-cal}} ~~~~"
		},
		"welcome-conserv": {
			description: "welcome for users with an apparent interest in conservatism topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-conserv}}"
		},
		"welcome-cycling": {
			description: "welcome for users with an apparent interest in cycling topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-cycling}} ~~~~"
		},
		"welcome-dbz": {
			description: "welcome for users with an apparent interest in Dragon Ball topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-dbz}}"
		},
		"welcome-et": {
			description: "welcome for users with an apparent interest in Estonia topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-et}}"
		},
		"welcome-in": {
			description: "welcome for users with an apparent interest in India topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-in}} ~~~~"
		},
		"welcome-de": {
			description: "welcome for users with an apparent interest in Germany topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-de}} ~~~~"
		},
		"welcome-math": {
			description: "welcome for users with an apparent interest in mathematical topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-math}} ~~~~"
		},
		"welcome-med": {
			description: "welcome for users with an apparent interest in medicine topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-med}} ~~~~"
		},
		"welcome-no": {
			description: "welcome for users with an apparent interest in Norway topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-no}} ~~~~"
		},
		"welcome-pk": {
			description: "welcome for users with an apparent interest in Pakistan topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-pk}} ~~~~"
		},
		"welcome-phys": {
			description: "welcome for users with an apparent interest in physics topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-phys}} ~~~~"
		},
		"welcome-pl": {
			description: "welcome for users with an apparent interest in Poland topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-pl}} ~~~~"
		},
		"welcome-rugbyunion": {
			description: "welcome for users with an apparent interest in rugby union topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-rugbyunion}} ~~~~"
		},
		"welcome-ru": {
			description: "welcome for users with an apparent interest in Russia topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-ru}} ~~~~"
		},
		"welcome-starwars": {
			description: "welcome for users with an apparent interest in Star Wars topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-starwars}} ~~~~"
		},
		"welcome-ch": {
			description: "welcome for users with an apparent interest in Switzerland topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-ch}} ~~~~"
		},
		"welcome-uk": {
			description: "welcome for users with an apparent interest in Ukraine topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-uk}} ~~~~"
		},
		"welcome-roads": {
			description: "welcome for users with an apparent interest in roads and highways topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-roads}}"
		},
		"welcome-videogames": {
			description: "welcome for users with an apparent interest in video game topics",
			linkedArticle: false,
			syntax: "{{subst:welcome-videogames}}"
		},

		// NON-ENGLISH WELCOMES

		"welcomeen-sq": {
			description: "welcome for users whose first language appears to be Albanian",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-sq}}"
		},
		"welcomeen-zh": {
			description: "welcome for users whose first language appears to be Chinese",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-zh}}"
		},
		"welcomeen-nl": {
			description: "welcome for users whose first language appears to be Dutch",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-nl}}"
		},
		"welcomeen-fi": {
			description: "welcome for users whose first language appears to be Finnish",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-fi}}"
		},
		"welcomeen-fr": {
			description: "welcome for users whose first language appears to be French",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-fr}}"
		},
		"welcomeen-de": {
			description: "welcome for users whose first language appears to be German",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-de}}"
		},
		"welcomeen-he": {
			description: "welcome for users whose first language appears to be Hebrew",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-he}}"
		},
		"welcomeen-ja": {
			description: "welcome for users whose first language appears to be Japanese",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-ja}}"
		},
		"welcomeen-ko": {
			description: "welcome for users whose first language appears to be Korean",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-ko}}"
		},
		"welcomeen-mr": {
			description: "welcome for users whose first language appears to be Marathi",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-mr}}"
		},
		"welcomeen-ml": {
			description: "welcome for users whose first language appears to be Malayalam",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-ml}}"
		},
		"welcomeen-or": {
			description: "welcome for users whose first language appears to be Oriya (Odia)",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-or}}"
		},
		"welcomeen-pt": {
			description: "welcome for users whose first language appears to be Portuguese",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-pt}}"
		},
		"welcomeen-ru": {
			description: "welcome for users whose first language appears to be Russian",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-ru}}"
		},
		"welcomeen-es": {
			description: "welcome for users whose first language appears to be Spanish",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-es}}"
		},
		"welcomeen-sv": {
			description: "welcome for users whose first language appears to be Swedish",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-sv}}"
		},
		"welcomeen-uk": {
			description: "welcome for users whose first language appears to be Ukrainian",
			linkedArticle: false,
			syntax: "{{subst:welcomeen-uk}}"
		}
	};

	Twinkle.welcome.getTemplateWikitext = function(template, article) {
		var properties = Twinkle.welcome.templates[template];
		if (properties) {
			return properties.syntax.
			replace("$USERNAME$", Twinkle.getFriendlyPref("insertUsername") ? mw.config.get("wgUserName") : "").
			replace("$ARTICLE$", article ? article : "").
			replace(/\$HEADER\$\s*/, "== Welcome ==\n\n").
			replace("$EXTRA$", ""); // EXTRA is not implemented yet
		} else {
			return "{{subst:" + template + (article ? ("|art=" + article) : "") + "}}" +
				(Twinkle.getFriendlyPref("customWelcomeSignature") ? " ~~~~" : "");
		}
	};

	Twinkle.welcome.callbacks = {
		preview: function(form) {
			var previewDialog = new Morebits.simpleWindow(750, 400);
			previewDialog.setTitle("Welcome template preview");
			previewDialog.setScriptName("Welcome user");
			previewDialog.setModality(true);

			var previewdiv = document.createElement("div");
			previewdiv.style.marginLeft = previewdiv.style.marginRight = "0.5em";
			previewdiv.style.fontSize = "small";
			previewDialog.setContent(previewdiv);

			var previewer = new Morebits.wiki.preview(previewdiv);
			previewer.beginRender(Twinkle.welcome.getTemplateWikitext(form.getChecked("template"), form.article.value));

			var submit = document.createElement("input");
			submit.setAttribute("type", "submit");
			submit.setAttribute("value", "Close");
			previewDialog.addContent(submit);

			previewDialog.display();

			$(submit).click(function(e) {
				previewDialog.close();
			});
		},
		main: function(pageobj) {
			var params = pageobj.getCallbackParameters();
			var text = pageobj.getPageText();

			// abort if mode is auto and form is not empty
			if (pageobj.exists() && params.mode === 'auto') {
				Morebits.status.info('Warning', 'వాడుకరి చర్చ పేజీ ఖాళీగా లేదు; ఆటోమాటిక్ స్వాగతాన్ని ఆపేస్తున్నాం');
				Morebits.wiki.actionCompleted.event();
				return;
			}

			var welcomeText = Twinkle.welcome.getTemplateWikitext(params.value, params.article);

			if (Twinkle.getFriendlyPref('topWelcomes')) {
				text = welcomeText + '\n\n' + text;
			} else {
				text += "\n" + welcomeText;
			}

			var summaryText = "వికీపీడియాకు స్వాగతం!";
			pageobj.setPageText(text);
			pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
			pageobj.setWatchlist(Twinkle.getFriendlyPref('watchWelcomes'));
			pageobj.setCreateOption('recreate');
			pageobj.save();
		}
	};

	Twinkle.welcome.callback.evaluate = function friendlywelcomeCallbackEvaluate(e) {
		var form = e.target;

		var params = {
			value: form.getChecked("template"),
			article: form.article.value,
			mode: 'manual'
		};

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(form);

		Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
		Morebits.wiki.actionCompleted.notice = "స్వాగతం చెప్పడం పూర్తయింది. చర్చ పేజీని కొద్ది సెకండ్లలో తిరిగి లోడు చేస్తాం";

		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "వాడుకరి చర్చ పేజీ మార్పు");
		wikipedia_page.setFollowRedirect(true);
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.load(Twinkle.welcome.callbacks.main);
	};

	/*
	 ****************************************
	 *** twinklearv.js: ARV module
	 ****************************************
	 * Mode of invocation:     Tab ("ARV")
	 * Active on:              Existing and non-existing user pages, user talk pages, contributions pages
	 * Config directives in:   TwinkleConfig
	 */

	Twinkle.arv = function twinklearv() {

		var username = Morebits.getPageAssociatedUser();
		if (username === false) {
			return;
		}

		var title = Morebits.isIPAddress(username) ? 'ఐపీపై నిర్వాహకులకు ఫిర్యాదు చెయ్యండి' : 'వాడుకరిపై నిర్వాహకులకు ఫిర్యాదు చెయ్యండి';

		twAddPortletLink(function() {
			Twinkle.arv.callback(username);
		}, "ARV", "tw-arv", title);
	};

	Twinkle.arv.callback = function(uid) {
		if (!twinkleUserAuthorized) {
			alert("మీ ఖాతా మరీ కొత్తది, ట్వింకిల్ వాడలేరు.");
			return;
		}
		if (uid === mw.config.get('wgUserName')) {
			alert('మీమీద మీరే ఫిర్యాదు చేసుకుంటారా?');
			return;
		}

		var Window = new Morebits.simpleWindow(600, 500);
		Window.setTitle("ఉన్నత స్థాయి ఫిర్యాదులు"); //Backronym
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("Guide to AIV", "WP:GAIV");
		Window.addFooterLink("UAA instructions", "WP:UAAI");
		Window.addFooterLink("About SPI", "WP:SPI");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#arv");

		var form = new Morebits.quickForm(Twinkle.arv.callback.evaluate);
		var categories = form.append({
			type: 'select',
			name: 'category',
			label: 'ఫిర్యాదు రకాన్ని ఎంచుకోండి: ',
			event: Twinkle.arv.callback.changeCategory
		});
		categories.append({
			type: 'option',
			label: 'దుశ్చర్య (WP:AIV)',
			value: 'aiv'
		});
		categories.append({
			type: 'option',
			label: 'వాడుకరిపేరు (WP:UAA)',
			value: 'username'
		});
		categories.append({
			type: 'option',
			label: 'సాక్‌పప్పెటీర్ (WP:SPI)',
			value: 'sock'
		});
		categories.append({
			type: 'option',
			label: 'సాక్‌పప్పెట్ (WP:SPI)',
			value: 'puppet'
		});
		form.append({
			type: 'field',
			label: 'Work area',
			name: 'work_area'
		});
		form.append({
			type: 'submit'
		});
		form.append({
			type: 'hidden',
			name: 'uid',
			value: uid
		});

		var result = form.render();
		Window.setContent(result);
		Window.display();

		// We must init the
		var evt = document.createEvent("Event");
		evt.initEvent('change', true, true);
		result.category.dispatchEvent(evt);
	};

	Twinkle.arv.callback.changeCategory = function(e) {
		var value = e.target.value;
		var root = e.target.form;
		var old_area = Morebits.quickForm.getElements(root, "work_area")[0];
		var work_area = null;

		switch (value) {
			case 'aiv':
				/* falls through */
			default:
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'దుశ్చర్య చేసినందుకు గాను వాడుకరిపై ఫిర్యాదు చెయ్యండి',
					name: 'work_area'
				});
				work_area.append({
					type: 'input',
					name: 'page',
					label: 'ప్రాథమికంగా లింకై ఉన్న పేజీ: ',
					tooltip: 'ఫిర్యాదులో ఈ పేజీకి లింకు ఇవ్వద్దనుకుంటే, ఖాళీగా వదిలెయ్యండి',
					value: Morebits.queryString.exists('vanarticle') ? Morebits.queryString.get('vanarticle') : '',
					event: function(e) {
						var value = e.target.value;
						var root = e.target.form;
						if (value === '') {
							root.badid.disabled = root.goodid.disabled = true;
						} else {
							root.badid.disabled = false;
							root.goodid.disabled = root.badid.value === '';
						}
					}
				});
				work_area.append({
					type: 'input',
					name: 'badid',
					label: 'దుశ్చర్య జరిగినపుడు లక్ష్యం పేజీ యొక్క కూర్పు ఐడి: ',
					tooltip: 'తేడా లింకు ఇవ్వద్దనుకుంటే, ఖాళీగా వదిలెయ్యండి',
					value: Morebits.queryString.exists('vanarticlerevid') ? Morebits.queryString.get('vanarticlerevid') : '',
					disabled: !Morebits.queryString.exists('vanarticle'),
					event: function(e) {
						var value = e.target.value;
						var root = e.target.form;
						root.goodid.disabled = value === '';
					}
				});
				work_area.append({
					type: 'input',
					name: 'goodid',
					label: 'లక్ష్యం పేజీలో దుశ్చర్య జరగక ముందు ఉన్న చివరి మంచి కూర్పు ఐడీ: ',
					tooltip: 'గత కూర్పుకు తేడా లింకును ఖాళీగా వదిలెయ్యి',
					value: Morebits.queryString.exists('vanarticlegoodrevid') ? Morebits.queryString.get('vanarticlegoodrevid') : '',
					disabled: !Morebits.queryString.exists('vanarticle') || Morebits.queryString.exists('vanarticlerevid')
				});
				work_area.append({
					type: 'checkbox',
					name: 'arvtype',
					list: [{
						label: 'చివరి హెచ్చరిక (4 లేదా 4im స్థాయి) ఇచ్చాక జరిగిన దుశ్చర్య',
						value: 'final'
					}, {
						label: 'ఇటీవలి నిరోధం ముగిసాక  (1 రోజు లోపలే) జరిగిన దుశ్చర్య',
						value: 'postblock'
					}, {
						label: 'దుశ్చర్య కోసమే సృష్టించారని తెలిసిపోతున్న ఖాతా',
						value: 'vandalonly',
						disabled: Morebits.isIPAddress(root.uid.value)
					}, {
						label: 'స్పామ్‌బాట్ గానీ, కాంప్రమైజు అయినట్లుగానీ  తెలిసిపోతున్న ఖాతా  ',
						value: 'spambot'
					}, {
						label: 'ప్రచారం కోసమే సృష్టించిన ఖాతా',
						value: 'promoonly'
					}]
				});
				work_area.append({
					type: 'textarea',
					name: 'reason',
					label: 'వ్యాఖ్య: '
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
			case 'username':
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'వాడుకరిపేరు ఉల్లంఘన గురించి ఫిర్యాదు చెయ్యండి',
					name: 'work_area'
				});
				work_area.append({
					type: 'header',
					label: 'అనుచితమైన వాడుకరిపేరు రకం (రకాలు)',
					tooltip: 'అపార్థానికి దారితీసేలా, ప్రచారం కోసం సృష్టించిన,  రోత కలిగించే, విధ్వంసకరంగా ఉండే వాడుకరిపేర్లను వికీపీడియా అనుమతించదు. అలాంటి డొమెయిన్ పేర్లు, ఈమెయిలు అడ్రసులకు కూడా అనుమతి లేదు. ఈ అంశాలు వాడుకరిపేర్లకు, సంతకాలకు కూడా వర్తిస్తాయి. వేరే భాషలో అనుచితమైన వాడుకరిపేర్లు, అలాంటి పేర్లను సూచించేవి, అక్షరక్రమంలో కొద్ది తేడాలతో ఉండేవి,  అన్యాపదేశంగా అలాంటి పేర్లను సూచించేవీ.. ఇవన్నీ కూడా అనుచితమే.'
				});
				work_area.append({
					type: 'checkbox',
					name: 'arvtype',
					list: [{
						label: 'అపార్థం కలిగించే వాడుకరిపేరు',
						value: 'misleading',
						tooltip: 'అపార్థం కలిగించే వాడుకరిపేరు వాడుకరి పట్ల తప్పుడు అర్థాలకు తీస్తూ ఉంటాయి. ఉదాహరణకు వాస్తవాన్ని వక్రీకరించేవి, లేని అధికారాన్ని చూపించేవి, ఈ ఖాతాను నిర్వహించేది ఒక వ్యక్తి కాదనీ, ఒక గ్రూపో, ఒక ప్రాజెక్టో, ఒక సమాజమో అనే తప్పుడు అర్థాన్ని కల్పించేవీ..'
					}, {
						label: 'ప్రచారపు వాడుకరిపేరు',
						value: 'promotional',
						tooltip: 'ప్రచారపు వాడుకరిపేర్లంటే ఏదైనా సంస్థకో, వెబ్‌సైటులో, గ్రూపుకో చేసే ప్రచార ప్రకటన లాంటివి. వాడుకరి ఆ పేరున్న సంస్థ పేజీలో ప్రచారపు దిద్దుబాటు చేస్తే తప్ప ఆ వాడుకరిపేరుపై ఫిర్యాదు చెయ్యకండి.'
					}, {
						label: 'రోత కలిగించే వాడుకరిపేరు',
						value: 'offensive',
						tooltip: 'రోత కలిగించే వాడుకరిపేర్ల వలన సామరస్య పూర్వక దిద్దుబాట్లు కష్టతరమౌతాయి, లేదా అసాధ్యమౌతాయి.'
					}, {
						label: 'విధ్వంసక వాడుకరిపేరు',
						value: 'disruptive',
						tooltip: 'విధ్వంసక వాడుకరిపేర్లంటే వ్యక్తిగత దాడులు చేసేవి, ఎగతాళి చేసేవి. వికీపీడియాలో కల్లోలం కలిగించే స్పష్టమైన ఉద్దేశాన్ని కనబరుస్తూ ఉంటాయి.'
					}]
				});
				work_area.append({
					type: 'textarea',
					name: 'reason',
					label: 'వ్యాఖ్య:'
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;

			case 'puppet':
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'అనుమానిత సాక్‌పపెట్‌పై ఫిర్యాదు చెయ్యండి',
					name: 'work_area'
				});
				work_area.append({
					type: 'input',
					name: 'sockmaster',
					label: 'సాక్‌పపెటీర్',
					tooltip: 'సాక్‌పపెటీర్ (సాక్‌పపెట్లను ఆడించేవారు) వాడుకరిపేరు (వాడుకరి: అనే ఆదిపదం లేకుండా)'
				});
				work_area.append({
					type: 'textarea',
					label: 'ఆధారం:',
					name: 'evidence',
					tooltip: 'మీ ఆధారాలను ఇవ్వండి. ఈ వాడుకరుల్లోని ప్రతి ఒక్కరూ అనేక ఖాతాలను వాడుతూ ఉండే అవకాశాం ఉందని తెలపాలి. అంటే తేడాలు, పేజీ చరిత్రలు తదితర సమాచార మన్నమాట. ఈ అంశంపై నిర్ణయం తీసుకోడానికి పనికి వచ్చే సమాచారం మాత్రమే అయి ఉండాలి. సాక్‌పపెట్రీకి, ఖాతాల దురుపయోగాలకు సంబంధించని చర్చ చెయ్యకండి.'
				});
				work_area.append({
					type: 'checkbox',
					list: [{
						label: 'చెక్‌యూజర్ సాక్ష్యం కావాలని అభ్యర్థించండి',
						name: 'checkuser',
						tooltip: 'చెక్‌యూజర్ అనేది సాక్‌పపెట్రీ ఆరోపణలకు సంబంధించి సాక్ష్యాన్ని సేకరించే సాంకేతిక పరికరం. సరైన కారణం లేకుండా దాన్ని వాడరు. అలాంటి కారణం ఉందని మీరు చూపించ గలగాలి. మీరు ఇచ్చే సమాచారం చెక్&యూజర్ అవసరాన్ని వివరించేటట్లు ఉండేలా చూసుకోండి.'
					}, {
						label: 'ఫిర్యాదు చేయబడిన వాడుకరికి తెలియపరచండి',
						name: 'notify',
						tooltip: 'తెలియజేయడం తప్పనిసరేమీ కాదు. చాలా సందర్భాల్లో, పదేపదే దుశ్చర్య చేసే సాక్‌పపెటీర్లకు గమనింపు పంపడం ప్రతికూల ఫలితాన్ని ఇవ్వవచ్చు. అయితే, మొదటిసారిగా ఫిర్యాదు చేయబడుతున్న వాడుకరుల విషయంలో ఈ గమనింపుల వలన కేసు మరింత పారదర్శకంగా, నిష్పాక్షికంగా ఉన్నట్లు వాళ్ళు భావించే అవకాశం ఉంటుంది. మీ విజ్ఞత వాడండి.'
					}]
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
			case 'sock':
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'సాక్‌పపెటీర్ అనుమానితులపై ఫిర్యాదు చెయ్యడి',
					name: 'work_area'
				});
				work_area.append({
					type: 'dyninput',
					name: 'sockpuppet',
					label: 'సాక్‌పపెట్లు',
					sublabel: 'Sock: ',
					tooltip: 'సాక్‌పపెట్ వాడుకరిపేరు (వాడుకరి: అనే ఆదిపదం లేకుండా)',
					min: 2
				});
				work_area.append({
					type: 'textarea',
					label: 'ఆధారం:',
					name: 'evidence',
					tooltip: 'మీ దగ్గరున్న ఆధారం ఇవ్వండి. ఈ వాడుకరులందరూ కూడా ఒకటి కంటే ఎక్కువ ఖాతాల దుర్వినియోగం చేస్తున్నట్లు అది స్పష్టం చెయ్యాలి. అంటే తేడాలు,పేజీ చరిత్రలు తదితర సమాచారం ప్రకారం ఈ వాడుకరులాందరూ ఒకరేనని, వాళ్ళు దుశ్చర్య చేస్తున్నారని అర్థం. అది కేవలం, ఈ అంశాన్ని నిర్ధారించే సాక్ష్యాలు మాత్రమే అయి ఉండాలి. ఇతర చర్చను నివారించండి .'
				});
				work_area.append({
					type: 'checkbox',
					list: [{
						label: 'చెక్‌యూజరు సాక్ష్యాన్ని అభ్యర్థించండి',
						name: 'checkuser',
						tooltip: 'CheckUser is a tool used to obtain technical evidence related to a sock-puppetry allegation. It will not be used without good cause, which you must clearly demonstrate. Make sure your evidence explains why CheckUser is appropriate.'
					}, {
						label: 'ఫిర్యాదు చేయబడిన వాడుకరులకు తెలియపరచండి',
						name: 'notify',
						tooltip: 'Notification is not mandatory. In many cases, especially of chronic sockpuppeteers, notification may be counterproductive. However, especially in less egregious cases involving users who has not been reported before, notification may make the cases fairer and also appear to be fairer in the eyes of the accused. Use your judgment.'
					}]
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
		}
	};

	Twinkle.arv.callback.evaluate = function(e) {

		var form = e.target;
		var reason = "";
		var comment = "";
		if (form.reason) {
			comment = form.reason.value;
		}
		var uid = form.uid.value;

		var types;
		switch (form.category.value) {

			// Report user for vandalism
			case 'aiv':
				/* falls through */
			default:
				types = form.getChecked('arvtype');
				if (!types.length && comment === '') {
					alert('కారణమేంటో చెప్పాలి');
					return;
				}

				types = types.map(function(v) {
					switch (v) {
						case 'final':
							return 'vandalism after final warning';
						case 'postblock':
							return 'vandalism after recent release of block';
						case 'spambot':
							return 'account is evidently a spambot or a compromised account';
						case 'vandalonly':
							return 'actions evidently indicate a vandalism-only account';
						case 'promoonly':
							return 'account is being used only for promotional purposes';
						default:
							return 'unknown reason';
					}
				}).join('; ');


				if (form.page.value !== '') {

					// add a leading : on linked page namespace to prevent transclusion
					reason = 'On [[' + form.page.value.replace(/^(Image|Category|File):/i, ':$1:') + ']]';

					if (form.badid.value !== '') {
						var query = {
							'title': form.page.value,
							'diff': form.badid.value,
							'oldid': form.goodid.value
						};
						reason += ' ({{diff|' + form.page.value + '|' + form.badid.value + '|' + form.goodid.value + '|diff}})';
					}
					reason += ':';
				}

				if (types) {
					reason += " " + types;
				}
				if (comment !== "") {
					reason += (reason === "" ? "" : ". ") + comment;
				}
				reason += ". ~~~~";
				reason = reason.replace(/\r?\n/g, "\n*:"); // indent newlines

				Morebits.simpleWindow.setButtonsEnabled(false);
				Morebits.status.init(form);

				Morebits.wiki.actionCompleted.redirect = "వికీపీడియా:Administrator intervention against vandalism";
				Morebits.wiki.actionCompleted.notice = "ఫిర్యాదు చెయ్యడం అయిపోయింది";

				var aivPage = new Morebits.wiki.page('వికీపీడియా:Administrator intervention against vandalism', 'AIV అభ్యర్థనను ప్రాసెస్ చేస్తున్నాం');
				aivPage.setPageSection(1);
				aivPage.setFollowRedirect(true);

				aivPage.load(function() {
					var text = aivPage.getPageText();

					// check if user has already been reported
					if (new RegExp("\\{\\{\\s*(?:(?:[Ii][Pp])?[Vv]andal|[Uu]serlinks)\\s*\\|\\s*(?:1=)?\\s*" + RegExp.escape(uid, true) + "\\s*\\}\\}").test(text)) {
						aivPage.getStatusElement().info('ఫిర్యాదు ఈసరికే ఉంది, కొత్తదాన్ని చేర్చం');
						return;
					}
					aivPage.getStatusElement().status('కొత్త ఫిర్యాదును చేరుస్తున్నాం...');
					aivPage.setEditSummary('Reporting [[Special:Contributions/' + uid + '|' + uid + ']].' + Twinkle.getPref('summaryAd'));
					aivPage.setAppendText('\n*{{' + (Morebits.isIPAddress(uid) ? 'IPvandal' : 'vandal') + '|' + (/\=/.test(uid) ? '1=' : '') + uid + '}} &ndash; ' + reason);
					aivPage.append();
				});
				break;

				// Report inappropriate username
			case 'username':
				types = form.getChecked('arvtype');
				if (!types.length) {
					alert('కనీసం ఒక ఉల్లంఘననైనా చూపించాలి');
					return;
				}
				types = types.map(Morebits.string.toLowerCaseFirstChar);

				if (types.length <= 2) {
					types = types.join(' and ');
				} else {
					types = [types.slice(0, -1).join(', '), types.slice(-1)].join(' and ');
				}
				var article = 'a';
				if (/[aeiouwyh]/.test(types[0])) { // non 100% correct, but whatever, inlcuding 'h' for Cockney
					article = 'an';
				}
				reason = "*{{user-uaa|1=" + uid + "}} &ndash; Violation of the username policy as " + article + " " + types + " username. ";
				if (comment !== '') {
					reason += Morebits.string.toUpperCaseFirstChar(comment) + ". ";
				}
				reason += "~~~~";
				reason = reason.replace(/\r?\n/g, "\n*:"); // indent newlines

				Morebits.simpleWindow.setButtonsEnabled(false);
				Morebits.status.init(form);

				Morebits.wiki.actionCompleted.redirect = "వికీపీడియా:Usernames for administrator attention";
				Morebits.wiki.actionCompleted.notice = "ఫిర్యాదు చెయ్యడం పూర్తయింది";

				var uaaPage = new Morebits.wiki.page('వికీపీడియా:Usernames for administrator attention', 'Processing UAA request');
				uaaPage.setFollowRedirect(true);

				uaaPage.load(function() {
					var text = uaaPage.getPageText();

					// check if user has already been reported
					if (new RegExp("\\{\\{\\s*user-uaa\\s*\\|\\s*(1\\s*=\\s*)?" + RegExp.escape(uid, true) + "\\s*(\\||\\})").test(text)) {
						uaaPage.getStatusElement().error('వాడుకరి ఈసరికే జాబితాలో ఉన్నారు.');
						return;
					}
					uaaPage.getStatusElement().status('కొత్త ఫిర్యాదును చేరుస్తున్నాం...');
					uaaPage.setEditSummary('Reporting [[Special:Contributions/' + uid + '|' + uid + ']].' + Twinkle.getPref('summaryAd'));
					uaaPage.setPageText(text.replace(/List begins below this line.\s*-->\s*/, "List begins below this line.\n-->\n" + reason + "\n\n")); // add at top
					uaaPage.save();
				});
				break;

				// WP:SPI
			case "sock":
				/* falls through */
			case "puppet":
				var sockParameters = {
					evidence: form.evidence.value.trimRight(),
					checkuser: form.checkuser.checked,
					notify: form.notify.checked
				};

				var puppetReport = form.category.value === "puppet";
				if (puppetReport && !(form.sockmaster.value.trim())) {
					if (!confirm("You have not entered a sockmaster account for this puppet. Do you want to report this account as a sockpuppeteer instead?")) {
						return;
					}
					puppetReport = false;
				}

				sockParameters.uid = puppetReport ? form.sockmaster.value.trimRight() : uid;
				sockParameters.sockpuppets = puppetReport ? [uid] : $.map($('input:text[name=sockpuppet]', form), function(o) {
					return $(o).val();
				});

				Morebits.simpleWindow.setButtonsEnabled(false);
				Morebits.status.init(form);
				Twinkle.arv.processSock(sockParameters);
				break;

		}
	};

	Twinkle.arv.processSock = function(params) {
		Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "పని పూర్తయింది"

		// notify all user accounts if requested
		if (params.notify && params.sockpuppets.length > 0) {

			var notifyEditSummary = "సాక్‌పపెటీరింగు అనుమానం గురించి గమనింపు పంపించాం." + Twinkle.getPref('summaryAd');
			var notifyText = "\n\n{{subst:socksuspectnotice|1=" + params.uid + "}} ~~~~";

			// notify user's master account
			var masterTalkPage = new Morebits.wiki.page('User talk:' + params.uid, 'సాక్‌పపెటీర్ అని అనుమానమున్న వారికి గమనింపు');
			masterTalkPage.setFollowRedirect(true);
			masterTalkPage.setEditSummary(notifyEditSummary);
			masterTalkPage.setAppendText(notifyText);
			masterTalkPage.append();

			var statusIndicator = new Morebits.status('సాక్‌పపెట్ అని అనుమానమున్న వారికి గమనింపు', '0%');
			var total = params.sockpuppets.length;
			var current = 0;

			// display status of notifications as they progress
			var onSuccess = function(sockTalkPage) {
				var now = parseInt(100 * ++(current) / total, 10) + '%';
				statusIndicator.update(now);
				sockTalkPage.getStatusElement().unlink();
				if (current >= total) {
					statusIndicator.info(now + ' (completed)');
				}
			};

			var socks = params.sockpuppets;

			// notify each puppet account
			for (var i = 0; i < socks.length; ++i) {
				var sockTalkPage = new Morebits.wiki.page('User talk:' + socks[i], "Notification for " + socks[i]);
				sockTalkPage.setFollowRedirect(true);
				sockTalkPage.setEditSummary(notifyEditSummary);
				sockTalkPage.setAppendText(notifyText);
				sockTalkPage.append(onSuccess);
			}
		}

		// prepare the SPI report
		var text = "\n\n{{subst:SPI report|socksraw=" +
			params.sockpuppets.map(function(v) {
				return "* {{" + (Morebits.isIPAddress(v) ? "checkip" : "checkuser") + "|1=" + v + "}}";
			}).join("\n") + "\n|evidence=" + params.evidence + " \n";

		if (params.checkuser) {
			text += "|checkuser=yes";
		}
		text += "}}";

		var reportpage = 'వికీపీడియా:Sockpuppet investigations/' + params.uid;

		Morebits.wiki.actionCompleted.redirect = reportpage;
		Morebits.wiki.actionCompleted.notice = "ఫిర్యాదు పూర్తయింది";

		var spiPage = new Morebits.wiki.page(reportpage, 'చర్చ పేజీని వెలికి తీస్తున్నాం');
		spiPage.setFollowRedirect(true);
		spiPage.setEditSummary('Adding new report for [[Special:Contributions/' + params.uid + '|' + params.uid + ']].' + Twinkle.getPref('summaryAd'));
		spiPage.setAppendText(text);
		spiPage.append();

		Morebits.wiki.removeCheckpoint(); // all page updates have been started
	};

	/*
	 ****************************************
	 *** twinklebatchdelete.js: Batch delete module (sysops only)
	 ****************************************
	 * Mode of invocation:     Tab ("D-batch")
	 * Active on:              Existing and non-existing non-articles, and Special:PrefixIndex
	 * Config directives in:   TwinkleConfig
	 */


	Twinkle.batchdelete = function twinklebatchdelete() {
		if (Morebits.userIsInGroup('sysop') && (mw.config.get('wgNamespaceNumber') > 0 || mw.config.get('wgCanonicalSpecialPageName') === 'Prefixindex')) {
			twAddPortletLink(Twinkle.batchdelete.callback, "D-batch", "tw-batch", "Delete pages found in this category/on this page");
		}
	};

	Twinkle.batchdelete.unlinkCache = {};
	Twinkle.batchdelete.callback = function twinklebatchdeleteCallback() {
		var Window = new Morebits.simpleWindow(800, 400);
		Window.setTitle("మూకుమ్మడి తొలగింపు");
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#batchdelete");

		var form = new Morebits.quickForm(Twinkle.batchdelete.callback.evaluate);
		form.append({
			type: 'checkbox',
			list: [{
				label: 'పేజీలను తొలగించు',
				name: 'delete_page',
				value: 'delete',
				checked: true
			}, {
				label: 'పేజీకి ఉన్న బ్యాక్‌లింకులను తీసివెయ్యి',
				name: 'unlink_page',
				value: 'unlink',
				checked: true
			}, {
				label: 'తొలగించిన పేజీలకు ఉన్న దారిమార్పులను తొలగించు',
				name: 'delete_redirects',
				value: 'delete_redirects',
				checked: true
			}]
		});
		form.append({
			type: 'textarea',
			name: 'reason',
			label: 'కారణం: '
		});

		var query;
		if (mw.config.get('wgNamespaceNumber') === 14) { // వర్గం:

			query = {
				'action': 'query',
				'generator': 'categorymembers',
				'gcmtitle': mw.config.get('wgPageName'),
				'gcmlimit': Twinkle.getPref('batchMax'), // the max for sysops
				'prop': ['categories', 'revisions'],
				'rvprop': ['size']
			};
		} else if (mw.config.get('wgCanonicalSpecialPageName') === 'Prefixindex') {

			var gapnamespace, gapprefix;
			if (Morebits.queryString.exists('from')) {
				gapnamespace = Morebits.queryString.get('namespace');
				gapprefix = Morebits.string.toUpperCaseFirstChar(Morebits.queryString.get('from'));
			} else {
				var pathSplit = location.pathname.split('/');
				if (pathSplit.length < 3 || pathSplit[2] !== "Special:PrefixIndex") {
					return;
				}
				var titleSplit = pathSplit[3].split(':');
				gapnamespace = mw.config.get("wgNamespaceIds")[titleSplit[0].toLowerCase()];
				if (titleSplit.length < 2 || typeof gapnamespace === 'undefined') {
					gapnamespace = 0; // article namespace
					gapprefix = pathSplit.splice(3).join('/');
				} else {
					pathSplit = pathSplit.splice(4);
					pathSplit.splice(0, 0, titleSplit.splice(1).join(':'));
					gapprefix = pathSplit.join('/');
				}
			}

			query = {
				'action': 'query',
				'generator': 'allpages',
				'gapnamespace': gapnamespace,
				'gapprefix': gapprefix,
				'gaplimit': Twinkle.getPref('batchMax'), // the max for sysops
				'prop': ['categories', 'revisions'],
				'rvprop': ['size']
			};
		} else {
			query = {
				'action': 'query',
				'generator': 'links',
				'titles': mw.config.get('wgPageName'),
				'gpllimit': Twinkle.getPref('batchMax'), // the max for sysops
				'prop': ['categories', 'revisions'],
				'rvprop': ['size']
			};
		}

		var wikipedia_api = new Morebits.wiki.api('Grabbing pages', query, function(self) {
			var xmlDoc = self.responseXML;
			var snapshot = xmlDoc.evaluate('//page[@ns != "6" and not(@missing)]', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); // 6 = File: namespace
			var list = [];
			for (var i = 0; i < snapshot.snapshotLength; ++i) {
				var object = snapshot.snapshotItem(i);
				var page = xmlDoc.evaluate('@title', object, null, XPathResult.STRING_TYPE, null).stringValue;
				var size = xmlDoc.evaluate('revisions/rev/@size', object, null, XPathResult.NUMBER_TYPE, null).numberValue;

				var disputed = xmlDoc.evaluate('boolean(categories/cl[@title="వర్గం:Contested candidates for speedy deletion"])', object, null, XPathResult.BOOLEAN_TYPE, null).booleanValue;
				list.push({
					label: page + ' (' + size + ' bytes)' + (disputed ? ' (DISPUTED CSD)' : ''),
					value: page,
					checked: !disputed
				});
			}
			self.params.form.append({
				type: 'checkbox',
				name: 'pages',
				list: list
			});
			self.params.form.append({
				type: 'submit'
			});

			var result = self.params.form.render();
			self.params.Window.setContent(result);
		});

		wikipedia_api.params = {
			form: form,
			Window: Window
		};
		wikipedia_api.post();
		var root = document.createElement('div');
		Morebits.status.init(root);
		Window.setContent(root);
		Window.display();
	};

	Twinkle.batchdelete.currentDeleteCounter = 0;
	Twinkle.batchdelete.currentUnlinkCounter = 0;
	Twinkle.batchdelete.currentdeletor = 0;
	Twinkle.batchdelete.callback.evaluate = function twinklebatchdeleteCallbackEvaluate(event) {
		Morebits.wiki.actionCompleted.notice = 'స్థితి';
		Morebits.wiki.actionCompleted.postfix = 'మూకుమ్మడి తొలగింపు పూర్తయింది';
		mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' ')); // for queen/king/whatever and country!
		var pages = event.target.getChecked('pages');
		var reason = event.target.reason.value;
		var delete_page = event.target.delete_page.checked;
		var unlink_page = event.target.unlink_page.checked;
		var delete_redirects = event.target.delete_redirects.checked;
		if (!reason) {
			return;
		}
		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(event.target);
		if (!pages) {
			Morebits.status.error('Error', 'తొలగించడానికి ఏమీ లేవు, ఆపేస్తున్నాం');
			return;
		}

		function toCall(work) {
			if (work.length === 0 && Twinkle.batchdelete.currentDeleteCounter <= 0 && Twinkle.batchdelete.currentUnlinkCounter <= 0) {
				window.clearInterval(Twinkle.batchdelete.currentdeletor);
				Morebits.wiki.removeCheckpoint();
				return;
			} else if (work.length !== 0 && (Twinkle.batchdelete.currentDeleteCounter <= Twinkle.getPref('batchDeleteMinCutOff') || Twinkle.batchdelete.currentUnlinkCounter <= Twinkle.getPref('batchDeleteMinCutOff'))) {
				Twinkle.batchdelete.unlinkCache = []; // Clear the cache
				var pages = work.shift();
				Twinkle.batchdelete.currentDeleteCounter += pages.length;
				Twinkle.batchdelete.currentUnlinkCounter += pages.length;
				for (var i = 0; i < pages.length; ++i) {
					var page = pages[i];
					var query = {
						'action': 'query',
						'titles': page
					};
					var wikipedia_api = new Morebits.wiki.api('Checking if page ' + page + ' exists', query, Twinkle.batchdelete.callbacks.main);
					wikipedia_api.params = {
						page: page,
						reason: reason,
						unlink_page: unlink_page,
						delete_page: delete_page,
						delete_redirects: delete_redirects
					};
					wikipedia_api.post();
				}
			}
		}
		var work = Morebits.array.chunk(pages, Twinkle.getPref('batchdeleteChunks'));
		Morebits.wiki.addCheckpoint();
		Twinkle.batchdelete.currentdeletor = window.setInterval(toCall, 1000, work);
	};

	Twinkle.batchdelete.callbacks = {
		main: function(self) {
			var xmlDoc = self.responseXML;
			var normal = xmlDoc.evaluate('//normalized/n/@to', xmlDoc, null, XPathResult.STRING_TYPE, null).stringValue;
			if (normal) {
				self.params.page = normal;
			}
			var exists = xmlDoc.evaluate('boolean(//pages/page[not(@missing)])', xmlDoc, null, XPathResult.BOOLEAN_TYPE, null).booleanValue;

			if (!exists) {
				self.statelem.error("పేజీ ఉన్నట్లు లేదు, బహుశా ఈసరికే తొలగించారేమో");
				return;
			}

			var query, wikipedia_api;
			if (self.params.unlink_page) {
				query = {
					'action': 'query',
					'list': 'backlinks',
					'blfilterredir': 'nonredirects',
					'blnamespace': [0, 100], // main space and portal space only
					'bltitle': self.params.page,
					'bllimit': Morebits.userIsInGroup('sysop') ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
				};
				wikipedia_api = new Morebits.wiki.api('Grabbing backlinks', query, Twinkle.batchdelete.callbacks.unlinkBacklinksMain);
				wikipedia_api.params = self.params;
				wikipedia_api.post();
			} else {
				--Twinkle.batchdelete.currentUnlinkCounter;
			}
			if (self.params.delete_page) {
				if (self.params.delete_redirects) {
					query = {
						'action': 'query',
						'list': 'backlinks',
						'blfilterredir': 'redirects',
						'bltitle': self.params.page,
						'bllimit': Morebits.userIsInGroup('sysop') ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
					};
					wikipedia_api = new Morebits.wiki.api('Grabbing redirects', query, Twinkle.batchdelete.callbacks.deleteRedirectsMain);
					wikipedia_api.params = self.params;
					wikipedia_api.post();
				}

				var wikipedia_page = new Morebits.wiki.page(self.params.page, 'పేజీ తొలగింపు ' + self.params.page);
				wikipedia_page.setEditSummary(self.params.reason + Twinkle.getPref('deletionSummaryAd'));
				wikipedia_page.deletePage(function(apiobj) {
					--Twinkle.batchdelete.currentDeleteCounter;
					var link = document.createElement('a');
					link.setAttribute('href', mw.util.getUrl(self.params.page));
					link.setAttribute('title', self.params.page);
					link.appendChild(document.createTextNode(self.params.page));
					apiobj.statelem.info(['completed (', link, ')']);
				});
			} else {
				--Twinkle.batchdelete.currentDeleteCounter;
			}
		},
		deleteRedirectsMain: function(self) {
			var xmlDoc = self.responseXML;
			var snapshot = xmlDoc.evaluate('//backlinks/bl/@title', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

			var total = snapshot.snapshotLength;

			if (snapshot.snapshotLength === 0) {
				return;
			}

			var statusIndicator = new Morebits.status('ఈ పేజీకి ఉన్న దారిమార్పులను తొలగిస్తున్నాం: ' + self.params.page, '0%');

			var onsuccess = function(self) {
				var obj = self.params.obj;
				var total = self.params.total;
				var now = parseInt(100 * ++(self.params.current) / total, 10) + '%';
				obj.update(now);
				self.statelem.unlink();
				if (self.params.current >= total) {
					obj.info(now + ' (completed)');
					Morebits.wiki.removeCheckpoint();
				}
			};


			Morebits.wiki.addCheckpoint();
			if (snapshot.snapshotLength === 0) {
				statusIndicator.info('100% (completed)');
				Morebits.wiki.removeCheckpoint();
				return;
			}

			var params = $.extend({}, self.params);
			params.current = 0;
			params.total = total;
			params.obj = statusIndicator;


			for (var i = 0; i < snapshot.snapshotLength; ++i) {
				var title = snapshot.snapshotItem(i).value;
				var wikipedia_page = new Morebits.wiki.page(title, "Deleting " + title);
				wikipedia_page.setEditSummary('[[WP:CSD#G8|G8]]: Redirect to deleted page "' + self.params.page + '"' + Twinkle.getPref('deletionSummaryAd'));
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.deletePage(onsuccess);
			}
		},
		unlinkBacklinksMain: function(self) {
			var xmlDoc = self.responseXML;
			var snapshot = xmlDoc.evaluate('//backlinks/bl/@title', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

			if (snapshot.snapshotLength === 0) {
				--Twinkle.batchdelete.currentUnlinkCounter;
				return;
			}

			var statusIndicator = new Morebits.status('ఈ పేజీకి ఉన్న లింకులను తీసేస్తున్నాం: ' + self.params.page, '0%');

			var total = snapshot.snapshotLength * 2;

			var onsuccess = function(self) {
				var obj = self.params.obj;
				var total = self.params.total;
				var now = parseInt(100 * ++(self.params.current) / total, 10) + '%';
				obj.update(now);
				self.statelem.unlink();
				if (self.params.current >= total) {
					obj.info(now + ' (completed)');
					--Twinkle.batchdelete.currentUnlinkCounter;
					Morebits.wiki.removeCheckpoint();
				}
			};

			Morebits.wiki.addCheckpoint();
			if (snapshot.snapshotLength === 0) {
				statusIndicator.info('100% (completed)');
				--Twinkle.batchdelete.currentUnlinkCounter;
				Morebits.wiki.removeCheckpoint();
				return;
			}
			self.params.total = total;
			self.params.obj = statusIndicator;
			self.params.current = 0;

			for (var i = 0; i < snapshot.snapshotLength; ++i) {
				var title = snapshot.snapshotItem(i).value;
				var wikipedia_page = new Morebits.wiki.page(title, "Unlinking on " + title);
				var params = $.extend({}, self.params);
				params.title = title;
				params.onsuccess = onsuccess;
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.batchdelete.callbacks.unlinkBacklinks);
			}
		},
		unlinkBacklinks: function(pageobj) {
			var params = pageobj.getCallbackParameters();
			if (!pageobj.exists()) {
				// we probably just deleted it, as a recursive backlink
				params.onsuccess({
					params: params,
					statelem: pageobj.getStatusElement()
				});
				Morebits.wiki.actionCompleted();
				return;
			}
			var text;

			if (params.title in Twinkle.batchdelete.unlinkCache) {
				text = Twinkle.batchdelete.unlinkCache[params.title];
			} else {
				text = pageobj.getPageText();
			}
			var old_text = text;
			var wikiPage = new Morebits.wikitext.page(text);
			wikiPage.removeLink(params.page);

			text = wikiPage.getText();
			Twinkle.batchdelete.unlinkCache[params.title] = text;
			if (text === old_text) {
				// Nothing to do, return
				params.onsuccess({
					params: params,
					statelem: pageobj.getStatusElement()
				});
				Morebits.wiki.actionCompleted();
				return;
			}
			pageobj.setEditSummary('Removing link(s) to deleted page ' + self.params.page + Twinkle.getPref('deletionSummaryAd'));
			pageobj.setPageText(text);
			pageobj.setCreateOption('nocreate');
			pageobj.save(params.onsuccess);
		}
	};

	/*
	 ****************************************
	 *** twinklebatchprotect.js: Batch protect module (sysops only)
	 ****************************************
	 * Mode of invocation:     Tab ("P-batch")
	 * Active on:              Existing project pages and user pages; existing and
	 *                         non-existing categories; Special:PrefixIndex
	 * Config directives in:   TwinkleConfig
	 */


	Twinkle.batchprotect = function twinklebatchprotect() {
		if (Morebits.userIsInGroup('sysop') && ((mw.config.get('wgArticleId') > 0 && (mw.config.get('wgNamespaceNumber') === 2 ||
					mw.config.get('wgNamespaceNumber') === 4)) || mw.config.get('wgNamespaceNumber') === 14 ||
				mw.config.get('wgCanonicalSpecialPageName') === 'Prefixindex')) {
			twAddPortletLink(Twinkle.batchprotect.callback, "P-batch", "tw-pbatch", "ఈ పేజీ నుండి లింకులున్న పేజీలను సంరక్షించు");
		}
	};

	Twinkle.batchprotect.unlinkCache = {};
	Twinkle.batchprotect.callback = function twinklebatchprotectCallback() {
		var Window = new Morebits.simpleWindow(800, 400);
		Window.setTitle("మూకుమ్మడి సంరక్షణ");
		Window.setScriptName("ట్వింకిల్");
		//Window.addFooterLink( "సంరక్షణ మూసలు", "Template:Protection templates" );
		Window.addFooterLink("సంరక్షణ విధానం", "WP:PROT");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#protect");

		var form = new Morebits.quickForm(Twinkle.batchprotect.callback.evaluate);
		form.append({
			type: 'checkbox',
			name: 'editmodify',
			event: Twinkle.protect.formevents.editmodify,
			list: [{
				label: 'దిద్దుబాటు సంరక్షణను సవరించండి',
				value: 'editmodify',
				tooltip: 'ఉనికిలో ఉన్న పేజీలకు మాత్రమే.',
				checked: true
			}]
		});
		var editlevel = form.append({
			type: 'select',
			name: 'editlevel',
			label: 'దిద్దుబాటు సంరక్షణ:',
			event: Twinkle.protect.formevents.editlevel
		});
		editlevel.append({
			type: 'option',
			label: 'అందరూ',
			value: 'all'
		});
		editlevel.append({
			type: 'option',
			label: 'ఆటోకన్ఫర్మ్‌డ్',
			value: 'autoconfirmed'
		});
		editlevel.append({
			type: 'option',
			label: 'నిర్వాహకులు',
			value: 'sysop',
			selected: true
		});
		form.append({
			type: 'select',
			name: 'editexpiry',
			label: 'ముగింపు:',
			event: function(e) {
				if (e.target.value === 'custom') {
					Twinkle.protect.doCustomExpiry(e.target);
				}
			},
			list: [{
				label: '1 గంట',
				value: '1 hour'
			}, {
				label: '2 గంటలు',
				value: '2 hours'
			}, {
				label: '3 గంటలు',
				value: '3 hours'
			}, {
				label: '6 గంటలు',
				value: '6 hours'
			}, {
				label: '12 గంటలు',
				value: '12 hours'
			}, {
				label: '1 రోజు',
				value: '1 day'
			}, {
				label: '2 రోజులు',
				selected: true,
				value: '2 days'
			}, {
				label: '3 రోజులు',
				value: '3 days'
			}, {
				label: '4 రోజులు',
				value: '4 days'
			}, {
				label: '1 వారం',
				value: '1 week'
			}, {
				label: '2 వారాలు',
				value: '2 weeks'
			}, {
				label: '1 నెల',
				value: '1 month'
			}, {
				label: '2 నెలలు',
				value: '2 months'
			}, {
				label: '3 నెలలు',
				value: '3 months'
			}, {
				label: '1 సంవత్సరం',
				value: '1 year'
			}, {
				label: 'అనిశ్చిత కాలం',
				value: 'indefinite'
			}, {
				label: 'వేరే వ్యవధి...',
				value: 'custom'
			}]
		});

		form.append({
			type: 'checkbox',
			name: 'movemodify',
			event: Twinkle.protect.formevents.movemodify,
			list: [{
				label: 'తరలింపు సంరక్షణను సవరించండి',
				value: 'movemodify',
				tooltip: 'ఉనికిలో ఉన్న పేజీలకు మాత్రమే.',
				checked: true
			}]
		});
		var movelevel = form.append({
			type: 'select',
			name: 'movelevel',
			label: 'తరలింపు సంరక్షణ:',
			event: Twinkle.protect.formevents.movelevel
		});
		movelevel.append({
			type: 'option',
			label: 'అందరూ',
			value: 'all'
		});
		movelevel.append({
			type: 'option',
			label: 'ఆటోకన్ఫర్మ్‌డ్',
			value: 'autoconfirmed'
		});
		movelevel.append({
			type: 'option',
			label: 'నిర్వాహకులు',
			value: 'sysop',
			selected: true
		});
		form.append({
			type: 'select',
			name: 'moveexpiry',
			label: 'ముగింపు:',
			event: function(e) {
				if (e.target.value === 'custom') {
					Twinkle.protect.doCustomExpiry(e.target);
				}
			},
			list: [{
				label: '1 గంట',
				value: '1 hour'
			}, {
				label: '2 గంటలు',
				value: '2 hours'
			}, {
				label: '3 గంటలు',
				value: '3 hours'
			}, {
				label: '6 గంటలు',
				value: '6 hours'
			}, {
				label: '12 గంటలు',
				value: '12 hours'
			}, {
				label: '1 రోజు',
				value: '1 day'
			}, {
				label: '2 రోజులు',
				selected: true,
				value: '2 days'
			}, {
				label: '3 రోజులు',
				value: '3 days'
			}, {
				label: '4 రోజులు',
				value: '4 days'
			}, {
				label: '1 వారం',
				value: '1 week'
			}, {
				label: '2 వారాలు',
				value: '2 weeks'
			}, {
				label: '1 నెల',
				value: '1 month'
			}, {
				label: '2 నెలలు',
				value: '2 months'
			}, {
				label: '3 నెలలు',
				value: '3 months'
			}, {
				label: '1 సంవత్సరం',
				value: '1 year'
			}, {
				label: 'అనిశ్చిత కాలం',
				value: 'indefinite'
			}, {
				label: 'కస్టమ్...',
				value: 'custom'
			}]
		});

		form.append({
			type: 'checkbox',
			name: 'createmodify',
			event: function twinklebatchprotectFormCreatemodifyEvent(e) {
				e.target.form.createlevel.disabled = !e.target.checked;
				e.target.form.createexpiry.disabled = !e.target.checked || (e.target.form.createlevel.value === 'all');
				e.target.form.createlevel.style.color = e.target.form.createexpiry.style.color = (e.target.checked ? "" : "transparent");
			},
			list: [{
				label: 'సృష్టి సంరక్షణను మార్చు',
				value: 'createmodify',
				tooltip: 'ఉనికిలో లేని పేజీల కోసం మాత్రమే.',
				checked: true
			}]
		});
		var createlevel = form.append({
			type: 'select',
			name: 'createlevel',
			label: 'సృష్టి సంరక్షణ:',
			event: Twinkle.protect.formevents.createlevel
		});
		createlevel.append({
			type: 'option',
			label: 'అందరూ',
			value: 'all'
		});
		createlevel.append({
			type: 'option',
			label: 'ఆటోకన్ఫర్మ్‌డ్',
			value: 'autoconfirmed'
		});
		createlevel.append({
			type: 'option',
			label: 'నిర్వాహకులు',
			value: 'sysop',
			selected: true
		});
		form.append({
			type: 'select',
			name: 'createexpiry',
			label: 'ముగింపు:',
			event: function(e) {
				if (e.target.value === 'custom') {
					Twinkle.protect.doCustomExpiry(e.target);
				}
			},
			list: [{
				label: '1 గంట',
				value: '1 hour'
			}, {
				label: '2 గంటలు',
				value: '2 hours'
			}, {
				label: '3 గంటలు',
				value: '3 hours'
			}, {
				label: '6 గంటలు',
				value: '6 hours'
			}, {
				label: '12 గంటలు',
				value: '12 hours'
			}, {
				label: '1 రోజు',
				value: '1 day'
			}, {
				label: '2 రోజులు',
				value: '2 days'
			}, {
				label: '3 రోజులు',
				value: '3 days'
			}, {
				label: '4 రోజులు',
				value: '4 days'
			}, {
				label: '1 వారం',
				value: '1 week'
			}, {
				label: '2 వారాలు',
				value: '2 weeks'
			}, {
				label: '1 నెల',
				value: '1 month'
			}, {
				label: '2 నెలలు',
				value: '2 months'
			}, {
				label: '3 నెలలు',
				value: '3 months'
			}, {
				label: '1 సంవత్సరం',
				value: '1 year'
			}, {
				label: 'అనిశ్చిత కాలం',
				selected: true,
				value: 'indefinite'
			}, {
				label: 'కస్టమ్...',
				value: 'custom'
			}]
		});

		form.append({
			type: 'textarea',
			name: 'reason',
			label: 'కారణం (సంరక్షణ చిట్టా కోసం): '
		});

		var query;

		if (mw.config.get('wgNamespaceNumber') === 14) { // categories
			query = {
				'action': 'query',
				'generator': 'categorymembers',
				'gcmtitle': mw.config.get('wgPageName'),
				'gcmlimit': Twinkle.getPref('batchMax'), // the max for sysops
				'prop': 'revisions',
				'rvprop': 'size'
			};
		} else if (mw.config.get('wgCanonicalSpecialPageName') === 'Prefixindex') {
			query = {
				'action': 'query',
				'generator': 'allpages',
				'gapnamespace': Morebits.queryString.exists('namespace') ? Morebits.queryString.get('namespace') : document.getElementById('namespace').value,
				'gapprefix': Morebits.queryString.exists('from') ? Morebits.string.toUpperCaseFirstChar(Morebits.queryString.get('from').replace('+', ' ')) : Morebits.string.toUpperCaseFirstChar(document.getElementById('nsfrom').value),
				'gaplimit': Twinkle.getPref('batchMax'), // the max for sysops
				'prop': 'revisions',
				'rvprop': 'size'
			};
		} else {
			query = {
				'action': 'query',
				'gpllimit': Twinkle.getPref('batchMax'), // the max for sysops
				'generator': 'links',
				'titles': mw.config.get('wgPageName'),
				'prop': 'revisions',
				'rvprop': 'size'
			};
		}

		var statusdiv = document.createElement("div");
		statusdiv.style.padding = '15px'; // just so it doesn't look broken
		Window.setContent(statusdiv);
		Morebits.status.init(statusdiv);
		Window.display();

		var statelem = new Morebits.status("పేజీల జాబితాను సేకరిస్తున్నాం");

		var wikipedia_api = new Morebits.wiki.api('loading...', query, function(apiobj) {
			var xml = apiobj.responseXML;
			var $pages = $(xml).find('page');
			var list = [];
			$pages.each(function(index, page) {
				var $page = $(page);
				var title = $page.attr('title');
				var isRedir = $page.attr('redirect') === ""; // XXX ??
				var missing = $page.attr('missing') === ""; // XXX ??
				var size = $page.find('rev').attr('size');

				var metadata = [];
				if (missing) {
					metadata.push("పేజీ ఉనికిలో లేదు");
				} else {
					if (isRedir) {
						metadata.push("redirect");
					}
					metadata.push(size + " బైట్లు");
				}
				list.push({
					label: title + (metadata.length ? (' (' + metadata.join('; ') + ')') : ''),
					value: title,
					checked: true
				});
			});
			form.append({
				type: 'header',
				label: 'సంరక్షించాల్సిన పేజీలు'
			});
			form.append({
				type: 'checkbox',
				name: 'pages',
				list: list
			});
			form.append({
				type: 'submit'
			});

			var result = form.render();
			Window.setContent(result);
		}, statelem);

		wikipedia_api.post();
	};

	Twinkle.batchprotect.currentProtectCounter = 0;
	Twinkle.batchprotect.currentprotector = 0;
	Twinkle.batchprotect.callback.evaluate = function twinklebatchprotectCallbackEvaluate(event) {
		var pages = event.target.getChecked('pages');
		var reason = event.target.reason.value;
		var editmodify = event.target.editmodify.checked;
		var editlevel = event.target.editlevel.value;
		var editexpiry = event.target.editexpiry.value;
		var movemodify = event.target.movemodify.checked;
		var movelevel = event.target.movelevel.value;
		var moveexpiry = event.target.moveexpiry.value;
		var createmodify = event.target.createmodify.checked;
		var createlevel = event.target.createlevel.value;
		var createexpiry = event.target.createexpiry.value;

		if (!reason) {
			alert("నిర్వాహకా, మీరొక కారణం చెప్పాల్సి ఉంది!");
			return;
		}

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(event.target);

		if (!pages) {
			Morebits.status.error('Error', 'సంరక్షించడానికి ఏమీ లేదు, ఆపేస్తున్నాం');
			return;
		}

		var toCall = function twinklebatchprotectToCall(work) {
			if (work.length === 0 && Twinkle.batchprotect.currentProtectCounter <= 0) {
				Morebits.status.info('పని ఐపోయింది');
				window.clearInterval(Twinkle.batchprotect.currentprotector);
				Twinkle.batchprotect.currentprotector = Twinkle.batchprotect.currentProtectCounter = 0;
				Morebits.wiki.removeCheckpoint();
				return;
			} else if (work.length !== 0 && Twinkle.batchprotect.currentProtectCounter <= Twinkle.getPref('batchProtectMinCutOff')) {
				var pages = work.shift();
				Twinkle.batchprotect.currentProtectCounter += pages.length;
				for (var i = 0; i < pages.length; ++i) {
					var page = pages[i];
					var query = {
						'action': 'query',
						'titles': page
					};
					var wikipedia_api = new Morebits.wiki.api('Checking if page ' + page + ' exists', query, Twinkle.batchprotect.callbacks.main);
					wikipedia_api.params = {
						page: page,
						reason: reason,
						editmodify: editmodify,
						editlevel: editlevel,
						editexpiry: editexpiry,
						movemodify: movemodify,
						movelevel: movelevel,
						moveexpiry: moveexpiry,
						createmodify: createmodify,
						createlevel: createlevel,
						createexpiry: createexpiry
					};
					wikipedia_api.post();
				}
			}
		};
		var work = Morebits.array.chunk(pages, Twinkle.getPref('batchProtectChunks'));
		Morebits.wiki.addCheckpoint();
		Twinkle.batchprotect.currentprotector = window.setInterval(toCall, 1000, work);
	};

	Twinkle.batchprotect.callbacks = {
		main: function(apiobj) {
			var xml = apiobj.responseXML;
			var normal = $(xml).find('normalized n').attr('to');
			if (normal) {
				apiobj.params.page = normal;
			}

			var exists = ($(xml).find('page').attr('missing') !== "");

			var page = new Morebits.wiki.page(apiobj.params.page, "Protecting " + apiobj.params.page);
			var takenAction = false;
			if (exists && apiobj.params.editmodify) {
				page.setEditProtection(apiobj.params.editlevel, apiobj.params.editexpiry);
				takenAction = true;
			}
			if (exists && apiobj.params.movemodify) {
				page.setMoveProtection(apiobj.params.movelevel, apiobj.params.moveexpiry);
				takenAction = true;
			}
			if (!exists && apiobj.params.createmodify) {
				page.setCreateProtection(apiobj.params.createlevel, apiobj.params.createexpiry);
				takenAction = true;
			}
			if (!takenAction) {
				Morebits.status.warn("Protecting " + apiobj.params.page, "పేజీ " + (exists ? "ఉంది" : "లేదు") + "; చెయ్యడానికి ఏం లేదు, వదిలేస్తున్నాం");
				return;
			}

			page.setEditSummary(apiobj.params.reason);

			page.protect(function(pageobj) {
				--Twinkle.batchprotect.currentProtectCounter;
				var link = document.createElement('a');
				link.setAttribute('href', mw.util.getUrl(apiobj.params.page));
				link.appendChild(document.createTextNode(apiobj.params.page));
				pageobj.getStatusElement().info(['completed (', link, ')']);
			});
		}
	};

	/*
	 ****************************************
	 *** twinklebatchundelete.js: Batch undelete module
	 ****************************************
	 * Mode of invocation:     Tab ("Und-batch")
	 * Active on:              Existing and non-existing user pages (??? why?)
	 * Config directives in:   TwinkleConfig
	 */

	// XXX TODO this module needs to be overhauled to use Morebits.wiki.page


	Twinkle.batchundelete = function twinklebatchundelete() {
		if (mw.config.get("wgNamespaceNumber") !== mw.config.get("wgNamespaceIds").user) {
			return;
		}
		if (Morebits.userIsInGroup('sysop')) {
			twAddPortletLink(Twinkle.batchundelete.callback, "Und-batch", "tw-batch-undel", "Undelete 'em all");
		}
	};

	Twinkle.batchundelete.callback = function twinklebatchundeleteCallback() {
		var Window = new Morebits.simpleWindow(800, 400);
		Window.setScriptName("ట్వింకిల్");
		Window.setTitle("మూకుమ్మడి తొలగింపు-రద్దు")
		var form = new Morebits.quickForm(Twinkle.batchundelete.callback.evaluate);
		form.append({
			type: 'textarea',
			name: 'reason',
			label: 'కారణం: '
		});

		var query = {
			'action': 'query',
			'generator': 'links',
			'titles': mw.config.get("wgPageName"),
			'gpllimit': Twinkle.getPref('batchMax') // the max for sysops
		};
		var wikipedia_api = new Morebits.wiki.api('Grabbing pages', query, function(self) {
			var xmlDoc = self.responseXML;
			var snapshot = xmlDoc.evaluate('//page[@missing]', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
			var list = [];
			for (var i = 0; i < snapshot.snapshotLength; ++i) {
				var object = snapshot.snapshotItem(i);
				var page = xmlDoc.evaluate('@title', object, null, XPathResult.STRING_TYPE, null).stringValue;
				list.push({
					label: page,
					value: page,
					checked: true
				});
			}
			self.params.form.append({
				type: 'checkbox',
				name: 'pages',
				list: list
			});
			self.params.form.append({
				type: 'submit'
			});

			var result = self.params.form.render();
			self.params.Window.setContent(result);


		});
		wikipedia_api.params = {
			form: form,
			Window: Window
		};
		wikipedia_api.post();
		var root = document.createElement('div');
		Morebits.status.init(root);
		Window.setContent(root);
		Window.display();
	};
	Twinkle.batchundelete.currentUndeleteCounter = 0;
	Twinkle.batchundelete.currentundeletor = 0;
	Twinkle.batchundelete.callback.evaluate = function(event) {
		Morebits.wiki.actionCompleted.notice = 'స్థితి';
		Morebits.wiki.actionCompleted.postfix = 'మూకుమ్మడి తొలగింపు-రద్దు పూర్తయింది';

		var pages = event.target.getChecked('pages');
		var reason = event.target.reason.value;
		if (!reason) {
			alert("కారణమొకటి ఇవ్వాలి!");
			return;
		}
		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(event.target);

		if (!pages) {
			Morebits.status.error('Error', 'రద్దు చేయ్యాల్సిన తొలగింపు లేమీ లేవు, ఆపేస్తున్నాం');
			return;
		}

		var work = Morebits.array.chunk(pages, Twinkle.getPref('batchUndeleteChunks'));
		Morebits.wiki.addCheckpoint();
		Twinkle.batchundelete.currentundeletor = window.setInterval(Twinkle.batchundelete.callbacks.main, 1000, work, reason);
	};

	Twinkle.batchundelete.callbacks = {
		main: function(work, reason) {
			if (work.length === 0 && Twinkle.batchundelete.currentUndeleteCounter <= 0) {
				Morebits.status.info('పని ఐపోయింది');
				window.clearInterval(Twinkle.batchundelete.currentundeletor);
				Morebits.wiki.removeCheckpoint();
				return;
			} else if (work.length !== 0 && Twinkle.batchundelete.currentUndeleteCounter <= Twinkle.getPref('batchUndeleteMinCutOff')) {
				var pages = work.shift();
				Twinkle.batchundelete.currentUndeleteCounter += pages.length;
				for (var i = 0; i < pages.length; ++i) {
					var title = pages[i];
					var query = {
						'token': mw.user.tokens.get().editToken,
						'title': title,
						'action': 'undelete',
						'reason': reason + Twinkle.getPref('deletionSummaryAd')
					};
					var wikipedia_api = new Morebits.wiki.api("తొలగింపు రద్దు చేస్తున్నాం " + title, query, function(self) {
						--Twinkle.batchundelete.currentUndeleteCounter;
						var link = document.createElement('a');
						link.setAttribute('href', mw.util.getUrl(self.itsTitle));
						link.setAttribute('title', self.itsTitle);
						link.appendChild(document.createTextNode(self.itsTitle));
						self.statelem.info(['completed (', link, ')']);

					});
					wikipedia_api.itsTitle = title;
					wikipedia_api.post();

				}
			}
		}
	};

	/*
	 ****************************************
	 *** twinkleconfig.js: Preferences module
	 ****************************************
	 * Mode of invocation:     Adds configuration form to Wikipedia:Twinkle/Preferences and user 
	                           subpages named "/Twinkle preferences", and adds ad box to the top of user 
	                           subpages belonging to the currently logged-in user which end in '.js'
	 * Active on:              What I just said.  Yeah.
	 * Config directives in:   TwinkleConfig

	 I, [[User:This, that and the other]], originally wrote this.  If the code is misbehaving, or you have any
	 questions, don't hesitate to ask me.  (This doesn't at all imply [[WP:OWN]]ership - it's just meant to
	 point you in the right direction.)  -- TTO
	 */


	Twinkle.config = {};

	Twinkle.config.commonEnums = {
		watchlist: {
			yes: "వీక్షణ జాబితాకు చేర్చు",
			no: "వీక్షణ జాబితాకు చేర్చవద్దు",
			"default": "నా అభిరుచులకు అనుగుణంగా"
		},
		talkPageMode: {
			window: "ఓ విండోలో, ఇతర వాడుకరి చర్చల స్థానంలో",
			tab: "ఓ కొత్త ట్యాబులో",
			blank: "ఓ సరికొత్త విండోలో"
		}
	};

	Twinkle.config.commonSets = {
		csdCriteria: {
			db: "వేరే కారణం ({{db}})",
			g1: "G1",
			g2: "G2",
			g3: "G3",
			g4: "G4",
			g5: "G5",
			g6: "G6",
			g7: "G7",
			g8: "G8",
			g10: "G10",
			g11: "G11",
			g12: "G12",
			a1: "A1",
			a2: "A2",
			a3: "A3",
			a5: "A5",
			a7: "A7",
			a9: "A9",
			a10: "A10",
			u1: "U1",
			u2: "U2",
			u3: "U3",
			f1: "F1",
			f2: "F2",
			f3: "F3",
			f7: "F7",
			f8: "F8",
			f9: "F9",
			f10: "F10",
			c1: "C1",
			t2: "T2",
			t3: "T3",
			r2: "R2",
			r3: "R3",
			p1: "P1",
			p2: "P2"
		},
		csdCriteriaDisplayOrder: [
			"db",
			"g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g10", "g11", "g12",
			"a1", "a2", "a3", "a5", "a7", "a9", "a10",
			"u1", "u2", "u3",
			"f1", "f2", "f3", "f7", "f8", "f9", "f10",
			"c1",
			"t2", "t3",
			"r2", "r3",
			"p1", "p2"
		],
		csdCriteriaNotification: {
			db: "వేరే కారణం ({{db}})",
			g1: "G1",
			g2: "G2",
			g3: "G3",
			g4: "G4",
			g6: 'G6 ("అక్కర్లేని అయోమయ నివృత్తి", "కాపీ పేస్టు తరలింపులు" మాత్రమే)',
			g10: "G10",
			g11: "G11",
			g12: "G12",
			a1: "A1",
			a2: "A2",
			a3: "A3",
			a5: "A5",
			a7: "A7",
			a9: "A9",
			a10: "A10",
			u3: "U3",
			f1: "F1",
			f2: "F2",
			f3: "F3",
			f7: "F7",
			f8: "F8",
			f9: "F9",
			f10: "F10",
			c1: "C1",
			t2: "T2",
			t3: "T3",
			r2: "R2",
			r3: "R3",
			p1: "P1",
			p2: "P2"
		},
		csdCriteriaNotificationDisplayOrder: [
			"db",
			"g1", "g2", "g3", "g4", "g6", "g10", "g11", "g12",
			"a1", "a2", "a3", "a5", "a7", "a9", "a10",
			"u3",
			"f1", "f2", "f3", "f7", "f9", "f10",
			"c1",
			"t2", "t3",
			"r2", "r3",
			"p1", "p2"
		],
		csdAndDICriteria: {
			db: "వేరే కారణం ({{db}})",
			g1: "G1",
			g2: "G2",
			g3: "G3",
			g4: "G4",
			g5: "G5",
			g6: "G6",
			g7: "G7",
			g8: "G8",
			g10: "G10",
			g11: "G11",
			g12: "G12",
			a1: "A1",
			a2: "A2",
			a3: "A3",
			a5: "A5",
			a7: "A7",
			a9: "A9",
			a10: "A10",
			u1: "U1",
			u2: "U2",
			u3: "U3",
			f1: "F1",
			f2: "F2",
			f3: "F3",
			f4: "F4",
			f5: "F5",
			f6: "F6",
			f7: "F7",
			f8: "F8",
			f9: "F9",
			f10: "F10",
			f11: "F11",
			c1: "C1",
			t2: "T2",
			t3: "T3",
			r2: "R2",
			r3: "R3",
			p1: "P1",
			p2: "P2"
		},
		csdAndDICriteriaDisplayOrder: [
			"db",
			"g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g10", "g11", "g12",
			"a1", "a2", "a3", "a5", "a7", "a9", "a10",
			"u1", "u2", "u3",
			"f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11",
			"c1",
			"t2", "t3",
			"r2", "r3",
			"p1", "p2"
		],
		namespacesNoSpecial: {
			"0": "వ్యాసం ",
			"1": "చర్చ (వ్యాసం)",
			"2": "వాడుకరి",
			"3": "వాడుకరి చర్చ",
			"4": "వికీపీడియా",
			"5": "వికీపీడియా చర్చ",
			"6": "దస్త్రం",
			"7": "దస్త్రం చర్చ",
			"8": "మీడియావికీ",
			"9": "మీడియావికీ చర్చ",
			"10": "మూస",
			"11": "మూస చర్చ",
			"12": "సహాయం",
			"13": "సహాయం చర్చ",
			"14": "వర్గం",
			"15": "వర్గం చర్చ",
			"100": "వేదిక",
			"101": "వేదిక చర్చ",
			"108": "పుస్తకం",
			"109": "పుస్తకం చర్చ"
		}
	};

	/**
	 * Section entry format:
	 *
	 * {
	 *   title: <human-readable section title>,
	 *   adminOnly: <true for admin-only sections>,
	 *   hidden: <true for advanced preferences that rarely need to be changed - they can still be modified by manually editing twinkleoptions.js>,
	 *   inFriendlyConfig: <true for preferences located under FriendlyConfig rather than TwinkleConfig>,
	 *   preferences: [
	 *     {
	 *       name: <TwinkleConfig property name>,
	 *       label: <human-readable short description - used as a form label>,
	 *       helptip: <(optional) human-readable text (using valid HTML) that complements the description, like limits, warnings, etc.>
	 *       adminOnly: <true for admin-only preferences>,
	 *       type: <string|boolean|integer|enum|set|customList> (customList stores an array of JSON objects { value, label }),
	 *       enumValues: <for type = "enum": a JSON object where the keys are the internal names and the values are human-readable strings>,
	 *       setValues: <for type = "set": a JSON object where the keys are the internal names and the values are human-readable strings>,
	 *       setDisplayOrder: <(optional) for type = "set": an array containing the keys of setValues (as strings) in the order that they are displayed>,
	 *       customListValueTitle: <for type = "customList": the heading for the left "value" column in the custom list editor>,
	 *       customListLabelTitle: <for type = "customList": the heading for the right "label" column in the custom list editor>
	 *     },
	 *     . . .
	 *   ]
	 * },
	 * . . .
	 *
	 */

	Twinkle.config.sections = [{
			title: "సాధారణం",
			preferences: [
				// TwinkleConfig.summaryAd (string)
				// Text to be appended to the edit summary of edits made using Twinkle
				{
					name: "summaryAd",
					label: "ట్వింకిల్ దిద్దుబాటు సారాంశాలకు చివరన \"Ad\" ను చేర్చాలి",
					helptip: "summary ad స్పేసుతో మొదలవ్వాలి, చిన్నదిగా ఉండాలి.",
					type: "string"
				},

				// TwinkleConfig.deletionSummaryAd (string)
				// Text to be appended to the edit summary of deletions made using Twinkle
				{
					name: "deletionSummaryAd",
					label: "తొలగింపు సారాంశాలకు వాడాల్సిన Summary ad",
					helptip: "సాధారణంగా పైనున్నదాని సారాంశమే ఇక్కడా ఉంటుంది.",
					adminOnly: true,
					type: "string"
				},

				// TwinkleConfig.protectionSummaryAd (string)
				// Text to be appended to the edit summary of page protections made using Twinkle
				{
					name: "protectionSummaryAd",
					label: "పేజీ సంరక్షణలకు వాడాల్సిన Summary ad",
					helptip: "సాధారణంగా పైనున్నదాని సారాంశమే ఇక్కడా ఉంటుంది.",
					adminOnly: true,
					type: "string"
				},

				// TwinkleConfig.userTalkPageMode may take arguments:
				// 'window': open a new window, remember the opened window
				// 'tab': opens in a new tab, if possible.
				// 'blank': force open in a new window, even if such a window exists
				{
					name: "userTalkPageMode",
					label: "వాడుకరి చర్చ పేజీని తెరిచేటపుడు, దాన్ని ఇలా తెరువు",
					type: "enum",
					enumValues: Twinkle.config.commonEnums.talkPageMode
				},

				// TwinkleConfig.dialogLargeFont (boolean)
				{
					name: "dialogLargeFont",
					label: "ట్వింకిల్ డయలాగు పెట్టెల్లో అక్షరాలను పెద్దవిగా చూపించు",
					type: "boolean"
				}
			]
		},

		{
			title: "బొమ్మ తొలగింపు (DI)",
			preferences: [
				// TwinkleConfig.notifyUserOnDeli (boolean)
				// If the user should be notified after placing a file deletion tag
				{
					name: "notifyUserOnDeli",
					label: "\"మొదట ఎక్కించిన వారికి తెలియపరచు\" పెట్టెలో డిఫాల్టుగా టిక్కు పెట్టు",
					type: "boolean"
				},

				// TwinkleConfig.deliWatchPage (string)
				// The watchlist setting of the page tagged for deletion. Either "yes", "no", or "default". Default is "default" (Duh).
				{
					name: "deliWatchPage",
					label: "బొమ్మ పేజీకి ట్యాగు పెట్టేటపుడు దాన్ని వీక్షణ జాబితాలో చేర్చు",
					type: "enum",
					enumValues: Twinkle.config.commonEnums.watchlist
				},

				// TwinkleConfig.deliWatchUser (string)
				// The watchlist setting of the user talk page if a notification is placed. Either "yes", "no", or "default". Default is "default" (Duh).
				{
					name: "deliWatchUser",
					label: "మొదట ఎక్కించిన వాడుకరికి తెలియపరచేటపుడు ఆ వాడుకరి చర్చ పేజీని వీక్షణ జాబితాలో చేర్చు",
					type: "enum",
					enumValues: Twinkle.config.commonEnums.watchlist
				}
			]
		},

		{
			title: "తొలగింపు ప్రతిపాదన (PROD)",
			preferences: [
				// TwinkleConfig.watchProdPages (boolean)
				// If, when applying prod template to page, to watch the page
				{
					name: "watchProdPages",
					label: "ట్యాగు పెట్టేటపుడు వ్యాసాన్ని వీక్షణ జాబితాలో చేర్చు",
					type: "boolean"
				},

				// TwinkleConfig.prodReasonDefault (string)
				// The prefilled PROD reason.
				{
					name: "prodReasonDefault",
					label: "ముందే నింపిపెట్టిన PROD కారణం",
					type: "string"
				},

				{
					name: "logProdPages",
					label: "PROD ట్యాగు పెట్టే అన్ని పేజీలను వాడుకరిబరి చిట్టాలో చేర్చి పెట్టు",
					helptip: "తొలగించిన పేజీలను చూసే అనుమతి నిర్వాహకేతరులకు ఉండదు కాబట్టి, ట్వింకిల్ ద్వారా PROD ట్యాగు పెట్టిన పేజీల జాబితాను చూసేందుకు వాడుకరిబరి చిట్టా చక్కటి మార్గం.",
					type: "boolean"
				}, {
					name: "prodLogPageName",
					label: "PROD వాడుకరిబరి చిట్టాని ఈ వాడుకరి పేజీలో ఉంచు",
					helptip: "ఈ పెట్టెలో ఒక ఉపపేజీ పేరు ఇవ్వండి. PROD చిట్టా User:<i>వాడుకరిపేరు</i>/<i>ఉపపేజీ పేరు</i> వద్ద చూడవచ్చు. PROD వాడుకరిబరి చిట్టాను ఎంచుకుంటేనే ఇది పనిచేస్తుంది.",
					type: "string"
				}
			]
		},

		{
			title: "వెనక్కి తిప్పడం, రోల్‌బ్యాక్", // twinklefluff module
			preferences: [
				// TwinkleConfig.openTalkPage (array)
				// What types of actions that should result in opening of talk page
				{
					name: "openTalkPage",
					label: "ఇలాంటి తిరగవేతల తరువాత వాడుకరి చర్చ పేజీని తెరువు",
					type: "set",
					setValues: {
						agf: "AGF రోల్‌బ్యాక్",
						norm: "సాధారణ రోల్‌బ్యాక్",
						vand: "దుశ్చర్య రోల్‌బ్యాక్",
						torev: "\"ఈ కూర్పును పునస్థాపించు\""
					}
				},

				// TwinkleConfig.openTalkPageOnAutoRevert (bool)
				// Defines if talk page should be opened when calling revert from contrib page, because from there, actions may be multiple, and opening talk page not suitable. If set to true, openTalkPage defines then if talk page will be opened.
				{
					name: "openTalkPageOnAutoRevert",
					label: "వాడుకరి రచనల పేజీ నుండి తిరగవేతలు చేసినపుడు వాడుకరి చర్చ పేజీని తెరువు",
					helptip: "చాలాసార్లు, దుశ్చర్య చేసిన వాడుకరి రచనల పేజీ నుండి అనేక పేజీలను ఒక్కసారే వెనక్కితిప్పడం జరుగుతూ ఉంటుంది. అలాంటి సందర్భాల్లో వాడుకరి చర్చ పేజీని తెరవడం ఇబ్బందిగా ఉండవచ్చు. అంచేత ఈ అంశం డిఫాల్టుగా ఆఫ్ చేసి ఉంటుంది. దీన్ని ఆన్ చేసినపుడు, ఇది పనిచెయ్యాలంటే దీనికి పైన ఉన్న సెట్టింగు లోని అంశాలు చేతనమై ఉండాలి.",
					type: "boolean"
				},

				// TwinkleConfig.markRevertedPagesAsMinor (array)
				// What types of actions that should result in marking edit as minor
				{
					name: "markRevertedPagesAsMinor",
					label: "ఈ రకపు తిరగవేతలను చిన్న మార్పులుగా గుర్తించు",
					type: "set",
					setValues: {
						agf: "AGF రోల్‌బ్యాక్",
						norm: "మామూలు రోల్‌బ్యాక్",
						vand: "దుశ్చర్య రోల్‌బ్యాక్",
						torev: "\"ఈ కూర్పును పునస్థాపించు\""
					}
				},

				// TwinkleConfig.watchRevertedPages (array)
				// What types of actions that should result in forced addition to watchlist
				{
					name: "watchRevertedPages",
					label: "ఈ రకపు తిరగవేతలు చేసినపుడు, పేజీలను వీక్షణ జాబితాకు చేర్చు",
					type: "set",
					setValues: {
						agf: "AGF రోల్‌బ్యాక్",
						norm: "మామూలు రోల్‌బ్యాక్",
						vand: "దుశ్చర్య రోల్‌బ్యాక్",
						torev: "\"ఈ కూర్పును పునస్థాపించు\""
					}
				},

				// TwinkleConfig.offerReasonOnNormalRevert (boolean)
				// If to offer a prompt for extra summary reason for normal reverts, default to true
				{
					name: "offerReasonOnNormalRevert",
					label: "మామూలు రోల్‌బ్యాక్‌లు చేసేటపుడు కారణం అడుగు",
					helptip: "\"మామూలు\" రోల్‌బ్యాక్‌లు అంటే మధ్యలో ఉన్న [రోల్‌బ్యాక్] లింకును నొక్కి చేసేవి.",
					type: "boolean"
				},

				{
					name: "confirmOnFluff",
					label: "వెనక్కి తిప్పేముందు నిర్ధారణ సందేశాన్ని చూపించు",
					helptip: "పెన్/టచ్ డివైసులు వాడేవారి కోసం, ఎప్పుడూ అనిశ్చితంగా ఉండేవారి కోసం.",
					type: "boolean"
				},

				// TwinkleConfig.showRollbackLinks (array)
				// Where Twinkle should show rollback links (diff, others, mine, contribs)
				// Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres
				{
					name: "showRollbackLinks",
					label: "ఈ పేజీల్లో రోల్‌బ్యాక్ లింకులు చూపించు",
					type: "set",
					setValues: {
						diff: "తేడా పేజీలు",
						others: "ఇతర వాడుకరుల రచనల పేజీలు",
						mine: "నా రచనల పేజీ"
					}
				}
			]
		},

		{
			title: "షేర్ ఐపీ ట్యాగులు",
			inFriendlyConfig: true,
			preferences: [{
				name: "markSharedIPAsMinor",
				label: "షేర్ ఐపీ ట్యాగు పెట్టడాన్ని చిన్న మార్పుగా చూపించు",
				type: "boolean"
			}]
		},

		{
			title: "సత్వర తొలగింపు (CSD)",
			preferences: [{
					name: "speedySelectionStyle",
					label: "ట్యాగు పెట్టడం/తొలగించడం చెయ్యాల్సినది ఎప్పుడు",
					type: "enum",
					enumValues: {
						"buttonClick": 'నేను "పంపించు" నొక్కినపుడు',
						"radioClick": "నేను ఏదైనా ఎంపికను నొక్కగానే"
					}
				}, {
					name: "speedyPromptOnG7",
					label: "G7 ట్యాగును (కర్త అభ్యర్ధన) పెట్టినపుడు కారణం అడుగు",
					type: "boolean"
				},

				// TwinkleConfig.watchSpeedyPages (array)
				// Whether to add speedy tagged pages to watchlist
				{
					name: "watchSpeedyPages",
					label: "ఈ కారణాలతో ట్యాగులు పెట్టినపుడు పేజీని వీక్షణ జాబితాకు చేర్చు",
					type: "set",
					setValues: Twinkle.config.commonSets.csdCriteria,
					setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder
				},

				// TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)
				// If, when applying speedy template to page, to mark the page as patrolled (if the page was reached from NewPages)
				{
					name: "markSpeedyPagesAsPatrolled",
					label: "ట్యాగులు పెట్టినపుడు, పేజీని తనిఖీ చేసినట్లు గుర్తించు (వీలైతే)",
					helptip: "సాంకేతిక పరిమితుల వలన, ప్రత్యేక:కొత్తపేజీలు పేజీ నుండి వెళ్ళినపుడు మాత్రమే పేజీని తనిఖీ చేసినట్లు గుర్తించడం కుదురుతుంది.",
					type: "boolean"
				},

				// TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)
				// What types of actions should result that the author of the page being notified of nomination
				{
					name: "notifyUserOnSpeedyDeletionNomination",
					label: "ఈ కారణాలతో ట్యాగులు పెట్టినపుడు మాత్రమే సృష్టించినవారికి తెలియపరచు",
					helptip: "మీరు CSD డయలాగు పెట్టెలో ఎంచుకున్నప్పటికీ, ఇక్కడ ఎంచుకుని ఉంటేనే గమనింపు వెళ్తుంది.",
					type: "set",
					setValues: Twinkle.config.commonSets.csdCriteriaNotification,
					setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
				},

				// TwinkleConfig.welcomeUserOnSpeedyDeletionNotification (array of strings)
				// On what types of speedy deletion notifications shall the user be welcomed
				// with a "first article" notice if his talk page has not yet been created.
				{
					name: "welcomeUserOnSpeedyDeletionNotification",
					label: "కింది కారణాలతో ట్యాగులు పెట్టేటపుడు, పేజీ సృష్టికర్తకు గమనింపుతో పాటు స్వాగతం కూడా పంపు",
					helptip: "తొలగింపు గురించి గమనింపు పంపేటపుడు మాత్రమే, వాడుకరి చర్చ పేజీ అసలు ఉనికిలోనే లేకపోతేనే స్వాగతం చెప్పాలి. అప్పుడు వాడే మూస {{<a href=\"" + mw.util.getUrl("Template:First article") + "\">First article</a>}}.",
					type: "set",
					setValues: Twinkle.config.commonSets.csdCriteriaNotification,
					setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
				},

				// TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)
				{
					name: "promptForSpeedyDeletionSummary",
					label: "కింది కారణాల వలన తొలగించేటపుడు, తొలగింపు సారాంశాన్ని సవరించనివ్వు",
					adminOnly: true,
					type: "set",
					setValues: Twinkle.config.commonSets.csdAndDICriteria,
					setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
				},

				// TwinkleConfig.openUserTalkPageOnSpeedyDelete (array of strings)
				// What types of actions that should result user talk page to be opened when speedily deleting (admin only)
				{
					name: "openUserTalkPageOnSpeedyDelete",
					label: "కింది కారణాల వలన తొలగించేటపుడు, వాడుకరి చర్చ పేజీని తెరువు",
					adminOnly: true,
					type: "set",
					setValues: Twinkle.config.commonSets.csdAndDICriteria,
					setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
				},

				// TwinkleConfig.deleteTalkPageOnDelete (boolean)
				// If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)
				{
					name: "deleteTalkPageOnDelete",
					label: "డిఫాల్టుగా, \"చర్చ పేజీని కూడా తొలగించు\" లో టిక్కు పెట్టు",
					adminOnly: true,
					type: "boolean"
				},

				{
					name: "deleteRedirectsOnDelete",
					label: "డిఫాల్టుగా, \"దారిమార్పులను కూడా తొలగించు\" లో టిక్కు పెట్టు",
					adminOnly: true,
					type: "boolean"
				},

				// TwinkleConfig.deleteSysopDefaultToTag (boolean)
				// Make the CSD screen default to "tag" instead of "delete" (admin only)
				{
					name: "deleteSysopDefaultToTag",
					label: "నేరుగా తొలగించే బదులు సత్వరమే ట్యాగులు పెట్టడాన్ని డిఫాల్టుగా ఎంచుకో",
					adminOnly: true,
					type: "boolean"
				},

				// TwinkleConfig.speedyWindowWidth (integer)
				// Defines the width of the Twinkle SD window in pixels
				{
					name: "speedyWindowWidth",
					label: "సత్వర తొలగింపు విండో వెడల్పు (పిక్సెళ్ళు)",
					type: "integer"
				},

				// TwinkleConfig.speedyWindowWidth (integer)
				// Defines the width of the Twinkle SD window in pixels
				{
					name: "speedyWindowHeight",
					label: "సత్వర తొలగింపు విండో ఎత్తు (పిక్సెళ్ళు)",
					helptip: "మీ మానిటరు పెద్దదైతే, దీన్ని పెంచుకోవచ్చు.",
					type: "integer"
				},

				{
					name: "logSpeedyNominations",
					label: "CSD నామినేషన్లన్నిటినీ వాడుకరిబరి లోని లాగ్‌లో చేర్చు",
					helptip: "తొలగించిన పేజీలను చూసే అనుమతి నిర్వాహకేతరులకు ఉండదు కాబట్టి, ట్వింకిల్ ద్వారా చేసిన CSD నామినేషన్ల జాబితాను చూసేందుకు వాడుకరిబరి చిట్టా చక్కటి మార్గం. DI వాడి ట్యాగులు పెట్టిన దస్త్రాలు కూడా ఈ చిట్టాలో చేరుతాయి.",
					type: "boolean"
				}, {
					name: "speedyLogPageName",
					label: "ఈ వాడుకరి ఉపపేజీలో CSD వాడుకరిబరి చిట్టాను చేర్చు",
					helptip: "ఈ పెట్టెలో ఒక ఉపపేజీ పేరు ఇవ్వండి. CSD చిట్టా User:<i>వాడుకరిపేరు</i>/<i>ఉపపేజీ పేరు</i> వద్ద చూడవచ్చు. CSD వాడుకరిబరి చిట్టాను ఎంచుకుంటేనే ఇది పనిచేస్తుంది.",
					type: "string"
				}, {
					name: "noLogOnSpeedyNomination",
					label: "ఈ కారణాలతో ట్యాగులు పెట్టేటపుడు వాడుకరిబరి చిట్టాలో చేర్చవద్దు",
					type: "set",
					setValues: Twinkle.config.commonSets.csdAndDICriteria,
					setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
				}
			]
		},

		{
			title: "ట్యాగు",
			inFriendlyConfig: true,
			preferences: [{
				name: "watchTaggedPages",
				label: "ట్యాగులు చేర్చే పేజీలను వీక్షణ జాబితాలో చేర్చు",
				type: "boolean"
			}, {
				name: "markTaggedPagesAsMinor",
				label: "ట్యాగులు చేర్చడాన్ని చిన్న మార్పుగా గుర్తించు",
				type: "boolean"
			}, {
				name: "markTaggedPagesAsPatrolled",
				label: "ట్యాగులు పెట్టినపుడు, పేజీని తనిఖీ చేసినట్లు గుర్తించు (వీలైతే)",
				helptip: "సాంకేతిక పరిమితుల వలన, ప్రత్యేక:కొత్తపేజీలు పేజీ నుండి వెళ్ళినపుడు మాత్రమే పేజీని తనిఖీ చేసినట్లు గుర్తించడం కుదురుతుంది.",
				type: "boolean"
			}, {
				name: "groupByDefault",
				label: "\"{{multiple issues}} గా గుదిగుచ్చి చూపించు\" ను డిఫాల్టుగా టిక్కు పెట్టు",
				type: "boolean"
			}, {
				name: "tagArticleSortOrder",
				label: "వ్యాసాల ట్యాగులను డిఫాల్టుగా చూపాల్సిన వరుస",
				type: "enum",
				enumValues: {
					"cat": "వర్గాల వారీగా",
					"alpha": "అక్షర క్రమంలో"
				}
			}, {
				name: "customTagList",
				label: "చూపించవలసిన వ్యాస నిర్వహణ కస్టమ్ ట్యాగులు",
				helptip: "ట్యాగుల జాబితాలో అడుగున ఇవి కనిపిస్తాయి. ఉదాహరణకు, ట్వింకిల్‌లో లేని కొత్త నిర్వహణ ట్యాగులేమైనా ఉంటే ఇక్కడ చేర్చవచ్చు.",
				type: "customList",
				customListValueTitle: "మూసపేరు (మీసాల బ్రాకెట్లు లేకుండా)",
				customListLabelTitle: "ట్యాగు డయలాగు పెట్టెలో చూపించాల్సిన పేరు"
			}]
		},

		{
			title: "టాక్‌బ్యాక్",
			inFriendlyConfig: true,
			preferences: [{
				name: "markTalkbackAsMinor",
				label: "టాక్‌బ్యాక్ లను చిన్న మార్పులుగా గుర్తించు",
				type: "boolean"
			}, {
				name: "insertTalkbackSignature",
				label: "టాక్‌బ్యాక్ లలో సంతకం  చేర్చు",
				type: "boolean"
			}, {
				name: "talkbackHeading",
				label: "టాక్‌బ్యాక్ ల కోసం వాడాల్సిన విభాగ శీర్షిక",
				type: "string"
			}, {
				name: "adminNoticeHeading",
				label: "నిర్వాహకుల నోటీసుబోర్డు నోటీసుల కోసం వాడాల్సిన విభాగ శీర్షిక",
				helptip: "నిర్వాహకుల నోటీసుబోర్డుకు మాత్రమే సంబంధితం",
				type: "string"
			}, {
				name: "mailHeading",
				label: "\"మీకు మెయిలొచ్చింది\" గమనింపులకు వాడాల్సిన విభాగ శీర్షిక ",
				type: "string"
			}]
		},

		{
			title: "లింకు తీసివేత",
			preferences: [
				// TwinkleConfig.unlinkNamespaces (array)
				// In what namespaces unlink should happen, default in 0 (article) and 100 (portal)
				{
					name: "unlinkNamespaces",
					label: "ఈ పేరుబరుల్లోని పేజీల నుండి వచ్చే లింకులను తీసివెయ్యి",
					helptip: "చర్చ పేరుబరులలో దేన్నీ ఎంచుకోకండి. పాత చర్చ పేజీల్లో కూడా లింకులు తీసేసే ప్రమాదం ఉంది (అలా చెయ్యనే కూడదు).",
					type: "set",
					setValues: Twinkle.config.commonSets.namespacesNoSpecial
				}
			]
		},

		{
			title: "వాడుకరికి హెచ్చరిక",
			preferences: [
				// TwinkleConfig.defaultWarningGroup (int)
				// if true, watch the page which has been dispatched an warning or notice, if false, default applies
				{
					name: "defaultWarningGroup",
					label: "డిఫాల్టు హెచ్చరిక స్థాయి",
					type: "enum",
					enumValues: {
						"1": "స్థాయి 1",
						"2": "స్థాయి 2",
						"3": "స్థాయి 3",
						"4": "స్థాయి 4",
						"5": "స్థాయి 4im",
						"6": "ఒక్కసారి మాత్రమే పంపే గమనింపులు",
						"7": "ఒక్కసారి మాత్రమే చేసే హెచ్చరికలు",
						"8": "నిరోధం (నిర్వాహకులు మాత్రమే)"
					}
				},

				// TwinkleConfig.showSharedIPNotice may take arguments:
				// true: to show shared ip notice if an IP address
				// false: to not print the notice
				{
					name: "showSharedIPNotice",
					label: "షేరు ఐపీ చర్చ పేజీల్లో అదనపు గమనింపును చేర్చు",
					helptip: "వాడే గమనింపు - {{<a href='" + mw.util.getUrl("Template:SharedIPAdvice") + "'>SharedIPAdvice</a>}}",
					type: "boolean"
				},

				// TwinkleConfig.watchWarnings (boolean)
				// if true, watch the page which has been dispatched an warning or notice, if false, default applies
				{
					name: "watchWarnings",
					label: "గమనింపు పంపేటపుడు వాడుకరి చర్చ పేజీని వీక్షణ జాబితాలో చేర్చు",
					type: "boolean"
				},

				// TwinkleConfig.blankTalkpageOnIndefBlock (boolean)
				// if true, blank the talk page when issuing an indef block notice (per [[WP:UW#Indefinitely blocked users]])
				{
					name: "blankTalkpageOnIndefBlock",
					label: "వాడుకరులను శాశ్వతంగా నిరోధించేటపుడు, వాడుకరి చర్చ పేజీని తుడిచివెయ్యి",
					helptip: "మరింత సమాచారం కోసం <a href=\"" + mw.util.getUrl("WP:UW#Indefinitely blocked users") + "\">WP:UW</a> చూడండి.",
					adminOnly: true,
					type: "boolean"
				}
			]
		},

		{
			title: "వాడుకరి ఆహ్వానం",
			inFriendlyConfig: true,
			preferences: [{
				name: "topWelcomes",
				label: "స్వాగత సందేశాన్ని వాడుకరి చర్చ పేజీల్లో ఈసరికే ఉన్న పాఠ్యానికి పైన పెట్టు",
				type: "boolean"
			}, {
				name: "watchWelcomes",
				label: "స్వాగతించేటపుడు వాడుకరి చర్చ పేజీని వీక్షణా జాబితాలో చేర్చు",
				helptip: "దానివలన వాడుకరికి స్వాగతం పలకడంలో వ్యక్తిగత బంధం ఏర్పడుతుంది - కొత్తగా వికీలో వారి ప్రయాణం ఎలా జరుగుతోందో మీరు చూడవచ్చు. అవసరమైనపుడు సాయపడనూ వచ్చు.",
				type: "boolean"
			}, {
				name: "insertUsername",
				label: "నా వాడుకరిపేరును మూసలో చేర్చు (వర్తించే చోట్ల)",
				helptip: "కొన్ని స్వాగత మూసల్లో సందేశం, నేను ఫలానా అని పరిచయం చేసుకుంటూ మొదలౌతుంది. ఈ వికల్పాన్ని ఎంచుకోకపోతే,  మీ పేరు రాదు.",
				type: "boolean"
			}, {
				name: "quickWelcomeMode",
				label: "తేడా పేజీలో ఉండగా \"స్వాగతం\" లింకును నొక్కినపుడు ",
				helptip: "ఆటోమాటిగ్గా స్వాగతం చెప్పు అని ఎంచుకుంటే, కింద మీరు సూచించిన మూసను వాడతాం.",
				type: "enum",
				enumValues: {
					auto: "ఆటోమాటిగ్గా స్వాగతం చెప్పు",
					norm: "స్వాగతం మూసను ఎంచుకోమని అడుగు"
				}
			}, {
				name: "quickWelcomeTemplate",
				label: "ఆటోమాటిగ్గా స్వాగతం చెప్పేటపుడు వాడాల్సిన మూస",
				helptip: "స్వాగత మూస పేరు, మీసాల బ్రాకెట్లు లేకుండా, ఇవ్వండి. వ్యాసానికి లింకు చేరుస్తాం.",
				type: "string"
			}, {
				name: "customWelcomeList",
				label: "చూపించాల్సిన కస్టమ్ మూసలు",
				helptip: "ఇతర స్వాగత మూసలను చేర్చుకోవచ్చు, స్వాగత మూస లాంటి వాడుకరి ఉపపేజీలను (పేరుకు ముందు \"వాడుకరి:\" అని ఉండే పేజీలు) చేర్చుకోవచ్చు. ఈ మూసలను వాడుకరి చర్చ పేజీల్లో సబ్‌స్టిట్యూటు చేస్తామని మరువకండి.",
				type: "customList",
				customListValueTitle: "మూస పేరు (మీసాల బ్రాకెట్లు లేకుండా)",
				customListLabelTitle: "స్వాగత డయలాగు పెట్టెలో చూపించాల్సిన పాఠ్యం"
			}, {
				name: "customWelcomeSignature",
				label: "కస్టమ్ స్వాగత మూసలో ఆటోమాటిగ్గా సంతకం పెట్టు",
				helptip: "మీ కస్టమ్ స్వాగత మూసల్లో అంతర్గతంగా సంతకం ఉంటే, ఈ వికల్పాన్ని ఆఫ్ చెయ్యండి.",
				type: "boolean"
			}]
		},

		{
			title: "XFD (తొలగింపు చర్చలు)",
			preferences: [
				// TwinkleConfig.xfdWatchPage (string)
				// The watchlist setting of the page being nominated for XfD. Either "yes" (add to watchlist), "no" (don't
				// add to watchlist), or "default" (use setting from preferences). Default is "default" (duh).
				{
					name: "xfdWatchPage",
					label: "నామినేషను చేసిన పేజీని వీక్షణ జాబితాలో చేర్చు",
					type: "enum",
					enumValues: Twinkle.config.commonEnums.watchlist
				},

				// TwinkleConfig.xfdWatchDiscussion (string)
				// The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),
				// or the list page for the other processes.
				// Either "yes" (add to watchlist), "no" (don't add to watchlist), or "default" (use setting from preferences). Default is "default" (duh).
				{
					name: "xfdWatchDiscussion",
					label: "తొలగింపు చర్చ పేజీని వీక్షణ జాబితాలో చేర్చు",
					helptip: "AfD, MfD ల చర్చా ఉపపేజీని ఇది సూచిస్తోంది",
					type: "enum",
					enumValues: Twinkle.config.commonEnums.watchlist
				},

				// TwinkleConfig.xfdWatchList (string)
				// The watchlist setting of the XfD list page, *if* the discussion is on a separate page. Either "yes" (add to watchlist), "no" (don't
				// add to watchlist), or "default" (use setting from preferences). Default is "no" (Hehe. Seriously though, who wants to watch it?
				// Sorry in advance for any false positives.).
				{
					name: "xfdWatchList",
					label: "రోజువారీ చిట్టా/జాబితా పేజీని వీక్షణ జాబితాలో చేర్చు (వర్తించే చోట్ల)",
					helptip: "ఇది AfD, MfD లకు మాత్రమే, అది కూడా అక్కడి చర్చలను రోజువారీ చిట్టా లోకి చేరుస్తూ ఉంటేనే వర్తిస్తుంది. ప్రస్తుతం తెవికీలో ఇది జరగడం లేదు.",
					type: "enum",
					enumValues: Twinkle.config.commonEnums.watchlist
				},

				// TwinkleConfig.xfdWatchUser (string)
				// The watchlist setting of the user if he receives a notification. Either "yes" (add to watchlist), "no" (don't
				// add to watchlist), or "default" (use setting from preferences). Default is "default" (duh).
				{
					name: "xfdWatchUser",
					label: "వాడుకరి చర్చ పేజీని వీక్షణ జాబితాలో చేర్చు (గమనింపు పంపేటపుడు)",
					type: "enum",
					enumValues: Twinkle.config.commonEnums.watchlist
				}
			]
		},

		{
			title: "Hidden",
			hidden: true,
			preferences: [
				// twinkle.header.js: portlet setup
				{
					name: "portletArea",
					type: "string"
				}, {
					name: "portletId",
					type: "string"
				}, {
					name: "portletName",
					type: "string"
				}, {
					name: "portletType",
					type: "string"
				}, {
					name: "portletNext",
					type: "string"
				},
				// twinklefluff.js: defines how many revision to query maximum, maximum possible is 50, default is 50
				{
					name: "revertMaxRevisions",
					type: "integer"
				},
				// twinklebatchdelete.js: How many pages should be processed at a time
				{
					name: "batchdeleteChunks",
					type: "integer"
				},
				// twinklebatchdelete.js: How many pages left in the process of being completed should allow a new batch to be initialized
				{
					name: "batchDeleteMinCutOff",
					type: "integer"
				},
				// twinklebatchdelete.js: How many pages should be processed maximum
				{
					name: "batchMax",
					type: "integer"
				},
				// twinklebatchprotect.js: How many pages should be processed at a time
				{
					name: "batchProtectChunks",
					type: "integer"
				},
				// twinklebatchprotect.js: How many pages left in the process of being completed should allow a new batch to be initialized
				{
					name: "batchProtectMinCutOff",
					type: "integer"
				},
				// twinklebatchundelete.js: How many pages should be processed at a time
				{
					name: "batchundeleteChunks",
					type: "integer"
				},
				// twinklebatchundelete.js: How many pages left in the process of being completed should allow a new batch to be initialized
				{
					name: "batchUndeleteMinCutOff",
					type: "integer"
				},
				// twinkledelimages.js: How many files should be processed at a time
				{
					name: "deliChunks",
					type: "integer"
				},
				// twinkledelimages.js: How many files should be processed maximum
				{
					name: "deliMax",
					type: "integer"
				},
				// twinkledeprod.js: How many pages should be processed at a time
				{
					name: "proddeleteChunks",
					type: "integer"
				}
			]
		}

	]; // end of Twinkle.config.sections

	//{
	//			name: "",
	//			label: "",
	//			type: ""
	//		},


	Twinkle.config.init = function twinkleconfigInit() {

		if ((mw.config.get("wgNamespaceNumber") === mw.config.get("wgNamespaceIds").project && mw.config.get("wgTitle") === "Twinkle/Preferences" ||
				(mw.config.get("wgNamespaceNumber") === mw.config.get("wgNamespaceIds").user && mw.config.get("wgTitle").lastIndexOf("/Twinkle preferences") === (mw.config.get("wgTitle").length - 20))) &&
			mw.config.get("wgAction") === "view") {
			// create the config page at Wikipedia:Twinkle/Preferences, and at user subpages (for testing purposes)

			if (!document.getElementById("twinkle-config")) {
				return; // maybe the page is misconfigured, or something - but any attempt to modify it will be pointless
			}

			// set style (the url() CSS function doesn't seem to work from wikicode - ?!)
			document.getElementById("twinkle-config-titlebar").style.backgroundImage = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB%2FqqA%2BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEhQTFRFr73ZobTPusjdsMHZp7nVwtDhzNbnwM3fu8jdq7vUt8nbxtDkw9DhpbfSvMrfssPZqLvVztbno7bRrr7W1d%2Fs1N7qydXk0NjpkW7Q%2BgAAADVJREFUeNoMwgESQCAAAMGLkEIi%2FP%2BnbnbpdB59app5Vdg0sXAoMZCpGoFbK6ciuy6FX4ABAEyoAef0BXOXAAAAAElFTkSuQmCC)";

			var contentdiv = document.getElementById("twinkle-config-content");
			contentdiv.textContent = ""; // clear children

			// let user know about possible conflict with monobook.js/vector.js file
			// (settings in that file will still work, but they will be overwritten by twinkleoptions.js settings)
			var contentnotice = document.createElement("p");
			// I hate innerHTML, but this is one thing it *is* good for...
			contentnotice.innerHTML = "<b>Before modifying your preferences here,</b> make sure you have removed any old <code>TwinkleConfig</code> and <code>FriendlyConfig</code> settings from your <a href=\"" + mw.util.getUrl("Special:MyPage/skin.js") + "\" title=\"Special:MyPage/skin.js\">user JavaScript file</a>.";
			contentdiv.appendChild(contentnotice);

			// look and see if the user does in fact have any old settings in their skin JS file
			var skinjs = new Morebits.wiki.page("User:" + mw.config.get("wgUserName") + "/" + mw.config.get("skin") + ".js");
			skinjs.setCallbackParameters(contentnotice);
			skinjs.load(Twinkle.config.legacyPrefsNotice);

			// start a table of contents
			var toctable = document.createElement("table");
			toctable.className = "toc";
			toctable.style.marginLeft = "0.4em";
			var toctr = document.createElement("tr");
			var toctd = document.createElement("td");
			// create TOC title
			var toctitle = document.createElement("div");
			toctitle.id = "toctitle";
			var toch2 = document.createElement("h2");
			toch2.textContent = "Contents ";
			toctitle.appendChild(toch2);
			// add TOC show/hide link
			var toctoggle = document.createElement("span");
			toctoggle.className = "toctoggle";
			toctoggle.appendChild(document.createTextNode("["));
			var toctogglelink = document.createElement("a");
			toctogglelink.className = "internal";
			toctogglelink.setAttribute("href", "#tw-tocshowhide");
			toctogglelink.textContent = "hide";
			toctoggle.appendChild(toctogglelink);
			toctoggle.appendChild(document.createTextNode("]"));
			toctitle.appendChild(toctoggle);
			toctd.appendChild(toctitle);
			// create item container: this is what we add stuff to
			var tocul = document.createElement("ul");
			toctogglelink.addEventListener("click", function twinkleconfigTocToggle() {
				var $tocul = $(tocul);
				$tocul.toggle();
				if ($tocul.find(":visible").length) {
					toctogglelink.textContent = "hide";
				} else {
					toctogglelink.textContent = "show";
				}
			}, false);
			toctd.appendChild(tocul);
			toctr.appendChild(toctd);
			toctable.appendChild(toctr);
			contentdiv.appendChild(toctable);

			var tocnumber = 1;

			var contentform = document.createElement("form");
			contentform.setAttribute("action", "javascript:void(0)"); // was #tw-save - changed to void(0) to work around Chrome issue
			contentform.addEventListener("submit", Twinkle.config.save, true);
			contentdiv.appendChild(contentform);

			var container = document.createElement("table");
			container.style.width = "100%";
			contentform.appendChild(container);

			$(Twinkle.config.sections).each(function(sectionkey, section) {
				if (section.hidden || (section.adminOnly && !Morebits.userIsInGroup("sysop"))) {
					return true; // i.e. "continue" in this context
				}

				var configgetter; // retrieve the live config values
				if (section.inFriendlyConfig) {
					configgetter = Twinkle.getFriendlyPref;
				} else {
					configgetter = Twinkle.getPref;
				}

				// add to TOC
				var tocli = document.createElement("li");
				tocli.className = "toclevel-1";
				var toca = document.createElement("a");
				toca.setAttribute("href", "#twinkle-config-section-" + tocnumber.toString());
				toca.appendChild(document.createTextNode(section.title));
				tocli.appendChild(toca);
				tocul.appendChild(tocli);

				var row = document.createElement("tr");
				var cell = document.createElement("td");
				cell.setAttribute("colspan", "3");
				var heading = document.createElement("h4");
				heading.style.borderBottom = "1px solid gray";
				heading.style.marginTop = "0.2em";
				heading.id = "twinkle-config-section-" + (tocnumber++).toString();
				heading.appendChild(document.createTextNode(section.title));
				cell.appendChild(heading);
				row.appendChild(cell);
				container.appendChild(row);

				var rowcount = 1; // for row banding

				// add each of the preferences to the form
				$(section.preferences).each(function(prefkey, pref) {
					if (pref.adminOnly && !Morebits.userIsInGroup("sysop")) {
						return true; // i.e. "continue" in this context
					}

					row = document.createElement("tr");
					row.style.marginBottom = "0.2em";
					// create odd row banding
					if (rowcount++ % 2 === 0) {
						row.style.backgroundColor = "rgba(128, 128, 128, 0.1)";
					}
					cell = document.createElement("td");

					var label, input;
					switch (pref.type) {

						case "boolean": // create a checkbox
							cell.setAttribute("colspan", "2");

							label = document.createElement("label");
							input = document.createElement("input");
							input.setAttribute("type", "checkbox");
							input.setAttribute("id", pref.name);
							input.setAttribute("name", pref.name);
							if (configgetter(pref.name) === true) {
								input.setAttribute("checked", "checked");
							}
							label.appendChild(input);
							label.appendChild(document.createTextNode(" " + pref.label));
							cell.appendChild(label);
							break;

						case "string": // create an input box
						case "integer":
							// add label to first column
							cell.style.textAlign = "right";
							cell.style.paddingRight = "0.5em";
							label = document.createElement("label");
							label.setAttribute("for", pref.name);
							label.appendChild(document.createTextNode(pref.label + ":"));
							cell.appendChild(label);
							row.appendChild(cell);

							// add input box to second column
							cell = document.createElement("td");
							cell.style.paddingRight = "1em";
							input = document.createElement("input");
							input.setAttribute("type", "text");
							input.setAttribute("id", pref.name);
							input.setAttribute("name", pref.name);
							if (pref.type === "integer") {
								input.setAttribute("size", 6);
								input.setAttribute("type", "number");
								input.setAttribute("step", "1"); // integers only
							}
							if (configgetter(pref.name)) {
								input.setAttribute("value", configgetter(pref.name));
							}
							cell.appendChild(input);
							break;

						case "enum": // create a combo box
							// add label to first column
							// note: duplicates the code above, under string/integer
							cell.style.textAlign = "right";
							cell.style.paddingRight = "0.5em";
							label = document.createElement("label");
							label.setAttribute("for", pref.name);
							label.appendChild(document.createTextNode(pref.label + ":"));
							cell.appendChild(label);
							row.appendChild(cell);

							// add input box to second column
							cell = document.createElement("td");
							cell.style.paddingRight = "1em";
							input = document.createElement("select");
							input.setAttribute("id", pref.name);
							input.setAttribute("name", pref.name);
							$.each(pref.enumValues, function(enumvalue, enumdisplay) {
								var option = document.createElement("option");
								option.setAttribute("value", enumvalue);
								if (configgetter(pref.name) === enumvalue) {
									option.setAttribute("selected", "selected");
								}
								option.appendChild(document.createTextNode(enumdisplay));
								input.appendChild(option);
							});
							cell.appendChild(input);
							break;

						case "set": // create a set of check boxes
							// add label first of all
							cell.setAttribute("colspan", "2");
							label = document.createElement("label"); // not really necessary to use a label element here, but we do it for consistency of styling
							label.appendChild(document.createTextNode(pref.label + ":"));
							cell.appendChild(label);

							var checkdiv = document.createElement("div");
							checkdiv.style.paddingLeft = "1em";
							var worker = function(itemkey, itemvalue) {
								var checklabel = document.createElement("label");
								checklabel.style.marginRight = "0.7em";
								checklabel.style.display = "inline-block";
								var check = document.createElement("input");
								check.setAttribute("type", "checkbox");
								check.setAttribute("id", pref.name + "_" + itemkey);
								check.setAttribute("name", pref.name + "_" + itemkey);
								if (configgetter(pref.name) && configgetter(pref.name).indexOf(itemkey) !== -1) {
									check.setAttribute("checked", "checked");
								}
								// cater for legacy integer array values for unlinkNamespaces (this can be removed a few years down the track...)
								if (pref.name === "unlinkNamespaces") {
									if (configgetter(pref.name) && configgetter(pref.name).indexOf(parseInt(itemkey, 10)) !== -1) {
										check.setAttribute("checked", "checked");
									}
								}
								checklabel.appendChild(check);
								checklabel.appendChild(document.createTextNode(itemvalue));
								checkdiv.appendChild(checklabel);
							};
							if (pref.setDisplayOrder) {
								// add check boxes according to the given display order
								$.each(pref.setDisplayOrder, function(itemkey, item) {
									worker(item, pref.setValues[item]);
								});
							} else {
								// add check boxes according to the order it gets fed to us (probably strict alphabetical)
								$.each(pref.setValues, worker);
							}
							cell.appendChild(checkdiv);
							break;

						case "customList":
							// add label to first column
							cell.style.textAlign = "right";
							cell.style.paddingRight = "0.5em";
							label = document.createElement("label");
							label.setAttribute("for", pref.name);
							label.appendChild(document.createTextNode(pref.label + ":"));
							cell.appendChild(label);
							row.appendChild(cell);

							// add button to second column
							cell = document.createElement("td");
							cell.style.paddingRight = "1em";
							var button = document.createElement("button");
							button.setAttribute("id", pref.name);
							button.setAttribute("name", pref.name);
							button.setAttribute("type", "button");
							button.addEventListener("click", Twinkle.config.listDialog.display, false);
							// use jQuery data on the button to store the current config value
							$(button).data({
								value: configgetter(pref.name),
								pref: pref,
								inFriendlyConfig: section.inFriendlyConfig
							});
							button.appendChild(document.createTextNode("మూసలను ఎంచుకోండి"));
							cell.appendChild(button);
							break;

						default:
							alert("twinkleconfig: unknown data type for preference " + pref.name);
							break;
					}
					row.appendChild(cell);

					// add help tip
					cell = document.createElement("td");
					cell.style.fontSize = "90%";

					cell.style.color = "gray";
					if (pref.helptip) {
						cell.innerHTML = pref.helptip;
					}
					// add reset link (custom lists don't need this, as their config value isn't displayed on the form)
					if (pref.type !== "customList") {
						var resetlink = document.createElement("a");
						resetlink.setAttribute("href", "#tw-reset");
						resetlink.setAttribute("id", "twinkle-config-reset-" + pref.name);
						resetlink.addEventListener("click", Twinkle.config.resetPrefLink, false);
						if (resetlink.style.styleFloat) { // IE (inc. IE9)
							resetlink.style.styleFloat = "right";
						} else { // standards
							resetlink.style.cssFloat = "right";
						}
						resetlink.style.margin = "0 0.6em";
						resetlink.appendChild(document.createTextNode("పూర్వస్థితికి"));
						cell.appendChild(resetlink);
					}
					row.appendChild(cell);

					container.appendChild(row);
					return true;
				});
				return true;
			});

			var footerbox = document.createElement("div");
			footerbox.setAttribute("id", "twinkle-config-buttonpane");
			footerbox.style.backgroundColor = "#BCCADF";
			footerbox.style.padding = "0.5em";
			var button = document.createElement("button");
			button.setAttribute("id", "twinkle-config-submit");
			button.setAttribute("type", "submit");
			button.appendChild(document.createTextNode("మార్పులను భద్రపరచు"));
			footerbox.appendChild(button);
			var footerspan = document.createElement("span");
			footerspan.className = "plainlinks";
			footerspan.style.marginLeft = "2.4em";
			footerspan.style.fontSize = "90%";
			var footera = document.createElement("a");
			footera.setAttribute("href", "#tw-reset-all");
			footera.setAttribute("id", "twinkle-config-resetall");
			footera.addEventListener("click", Twinkle.config.resetAllPrefs, false);
			footera.appendChild(document.createTextNode("డిఫాల్టులను పునస్థాపించు"));
			footerspan.appendChild(footera);
			footerbox.appendChild(footerspan);
			contentform.appendChild(footerbox);

			// since all the section headers exist now, we can try going to the requested anchor
			if (location.hash) {
				location.hash = location.hash;
			}

		} else if (mw.config.get("wgNamespaceNumber") === mw.config.get("wgNamespaceIds").user) {

			var box = document.createElement("div");
			box.setAttribute("id", "twinkle-config-headerbox");
			box.style.border = "1px #f60 solid";
			box.style.background = "#fed";
			box.style.padding = "0.6em";
			box.style.margin = "0.5em auto";
			box.style.textAlign = "center";

			var link;
			if (mw.config.get("wgTitle") === mw.config.get("wgUserName") + "/twinkleoptions.js") {
				// place "why not try the preference panel" notice
				box.style.fontWeight = "bold";
				box.style.width = "80%";
				box.style.borderWidth = "2px";

				if (mw.config.get("wgArticleId") > 0) { // page exists
					box.appendChild(document.createTextNode("ఈ పేజీలో మీ ట్వింకిల్ అభిరుచులు ఉంటాయి. వాటిని మార్చుకోడానికి ఈ పేజీని వాడండి: "));
				} else { // page does not exist
					box.appendChild(document.createTextNode("మీ ట్వింకిల్‌ను మీ అభిరుచుల మేరకు తీర్చిదిద్దుకోవచ్చు. అందుకోసం ఈ పేజీని వాడండి: "));
				}
				link = document.createElement("a");
				link.setAttribute("href", mw.util.getUrl(mw.config.get("wgFormattedNamespaces")[mw.config.get("wgNamespaceIds").project] + ":Twinkle/Preferences"));
				link.appendChild(document.createTextNode("ట్వింకిల్ అభిరుచుల ప్యానెల్"));
				box.appendChild(link);
				box.appendChild(document.createTextNode(", లేదా ఈ పేజీని దిద్దుబాటు చేసైనా చెయ్యవచ్చు."));
				$(box).insertAfter($("#contentSub"));

			} else if (mw.config.get("wgTitle").indexOf(mw.config.get("wgUserName")) === 0 &&
				mw.config.get("wgPageName").lastIndexOf(".js") === mw.config.get("wgPageName").length - 3) {
				// place "Looking for Twinkle options?" notice
				box.style.width = "60%";

				box.appendChild(document.createTextNode("ట్వింకిల్ అభిరుచులను స్థాపించుకోవాలనుకుంటే, మీరు ఇది వాడవచ్చు: "));
				link = document.createElement("a");
				link.setAttribute("href", mw.util.getUrl(mw.config.get("wgFormattedNamespaces")[mw.config.get("wgNamespaceIds").project] + ":Twinkle/Preferences"));
				link.appendChild(document.createTextNode("ట్వింకిల్ అభిరుచుల ప్యానెల్"));
				box.appendChild(link);
				box.appendChild(document.createTextNode("."));
				$(box).insertAfter($("#contentSub"));
			}
		}
	};

	// Morebits.wiki.page callback from init code
	Twinkle.config.legacyPrefsNotice = function twinkleconfigLegacyPrefsNotice(pageobj) {
		var text = pageobj.getPageText();
		var contentnotice = pageobj.getCallbackParameters();
		if (text.indexOf("TwinkleConfig") !== -1 || text.indexOf("FriendlyConfig") !== -1) {
			contentnotice.innerHTML = '<table class="plainlinks ombox ombox-content"><tr><td class="mbox-image">' +
				'<img alt="" src="http://upload.wikimedia.org/wikipedia/en/3/38/Imbox_content.png" /></td>' +
				'<td class="mbox-text"><p><big><b>Before modifying your settings here,</b> you must remove your old Twinkle and Friendly settings from your personal skin JavaScript.</big></p>' +
				'<p>To do this, you can <a href="' + mw.config.get("wgScript") + '?title=User:' + encodeURIComponent(mw.config.get("wgUserName")) + '/' + mw.config.get("skin") + '.js&action=edit" target="_tab"><b>edit your personal JavaScript</b></a>, removing all lines of code that refer to <code>TwinkleConfig</code> and <code>FriendlyConfig</code>.</p>' +
				'</td></tr></table>';
		} else {
			$(contentnotice).remove();
		}
	};

	// custom list-related stuff

	Twinkle.config.listDialog = {};

	Twinkle.config.listDialog.addRow = function twinkleconfigListDialogAddRow(dlgtable, value, label) {
		var contenttr = document.createElement("tr");
		// "remove" button
		var contenttd = document.createElement("td");
		var removeButton = document.createElement("button");
		removeButton.setAttribute("type", "button");
		removeButton.addEventListener("click", function() {
			$(contenttr).remove();
		}, false);
		removeButton.textContent = "Remove";
		contenttd.appendChild(removeButton);
		contenttr.appendChild(contenttd);

		// value input box
		contenttd = document.createElement("td");
		var input = document.createElement("input");
		input.setAttribute("type", "text");
		input.className = "twinkle-config-customlist-value";
		input.style.width = "97%";
		if (value) {
			input.setAttribute("value", value);
		}
		contenttd.appendChild(input);
		contenttr.appendChild(contenttd);

		// label input box
		contenttd = document.createElement("td");
		input = document.createElement("input");
		input.setAttribute("type", "text");
		input.className = "twinkle-config-customlist-label";
		input.style.width = "98%";
		if (label) {
			input.setAttribute("value", label);
		}
		contenttd.appendChild(input);
		contenttr.appendChild(contenttd);

		dlgtable.appendChild(contenttr);
	};

	Twinkle.config.listDialog.display = function twinkleconfigListDialogDisplay(e) {
		var $prefbutton = $(e.target);
		var curvalue = $prefbutton.data("value");
		var curpref = $prefbutton.data("pref");

		var dialog = new Morebits.simpleWindow(720, 400);
		dialog.setTitle(curpref.label);
		dialog.setScriptName("Twinkle preferences");

		var dialogcontent = document.createElement("div");
		var dlgtable = document.createElement("table");
		dlgtable.className = "wikitable";
		dlgtable.style.margin = "1.4em 1em";
		dlgtable.style.width = "auto";

		var dlgtbody = document.createElement("tbody");

		// header row
		var dlgtr = document.createElement("tr");
		// top-left cell
		var dlgth = document.createElement("th");
		dlgth.style.width = "5%";
		dlgtr.appendChild(dlgth);
		// value column header
		dlgth = document.createElement("th");
		dlgth.style.width = "35%";
		dlgth.textContent = (curpref.customListValueTitle ? curpref.customListValueTitle : "Value");
		dlgtr.appendChild(dlgth);
		// label column header
		dlgth = document.createElement("th");
		dlgth.style.width = "60%";
		dlgth.textContent = (curpref.customListLabelTitle ? curpref.customListLabelTitle : "Label");
		dlgtr.appendChild(dlgth);
		dlgtbody.appendChild(dlgtr);

		// content rows
		var gotRow = false;
		$.each(curvalue, function(k, v) {
			gotRow = true;
			Twinkle.config.listDialog.addRow(dlgtbody, v.value, v.label);
		});
		// if there are no values present, add a blank row to start the user off
		if (!gotRow) {
			Twinkle.config.listDialog.addRow(dlgtbody);
		}

		// final "add" button
		var dlgtfoot = document.createElement("tfoot");
		dlgtr = document.createElement("tr");
		var dlgtd = document.createElement("td");
		dlgtd.setAttribute("colspan", "3");
		var addButton = document.createElement("button");
		addButton.style.minWidth = "8em";
		addButton.setAttribute("type", "button");
		addButton.addEventListener("click", function(e) {
			Twinkle.config.listDialog.addRow(dlgtbody);
		}, false);
		addButton.textContent = "Add";
		dlgtd.appendChild(addButton);
		dlgtr.appendChild(dlgtd);
		dlgtfoot.appendChild(dlgtr);

		dlgtable.appendChild(dlgtbody);
		dlgtable.appendChild(dlgtfoot);
		dialogcontent.appendChild(dlgtable);

		// buttonpane buttons: [Save changes] [Reset] [Cancel]
		var button = document.createElement("button");
		button.setAttribute("type", "submit"); // so Morebits.simpleWindow puts the button in the button pane
		button.addEventListener("click", function(e) {
			Twinkle.config.listDialog.save($prefbutton, dlgtbody);
			dialog.close();
		}, false);
		button.textContent = "మార్పులను భద్రపరచు";
		dialogcontent.appendChild(button);
		button = document.createElement("button");
		button.setAttribute("type", "submit"); // so Morebits.simpleWindow puts the button in the button pane
		button.addEventListener("click", function(e) {
			Twinkle.config.listDialog.reset($prefbutton, dlgtbody);
		}, false);
		button.textContent = "పూర్వస్థితికి";
		dialogcontent.appendChild(button);
		button = document.createElement("button");
		button.setAttribute("type", "submit"); // so Morebits.simpleWindow puts the button in the button pane
		button.addEventListener("click", function(e) {
			dialog.close(); // the event parameter on this function seems to be broken
		}, false);
		button.textContent = "రద్దుచెయ్యి";
		dialogcontent.appendChild(button);

		dialog.setContent(dialogcontent);
		dialog.display();
	};

	// Resets the data value, re-populates based on the new (default) value, then saves the
	// old data value again (less surprising behaviour)
	Twinkle.config.listDialog.reset = function twinkleconfigListDialogReset(button, tbody) {
		// reset value on button
		var $button = $(button);
		var curpref = $button.data("pref");
		var oldvalue = $button.data("value");
		Twinkle.config.resetPref(curpref, $button.data("inFriendlyConfig"));

		// reset form
		var $tbody = $(tbody);
		$tbody.find("tr").slice(1).remove(); // all rows except the first (header) row
		// add the new values
		var curvalue = $button.data("value");
		$.each(curvalue, function(k, v) {
			Twinkle.config.listDialog.addRow(tbody, v.value, v.label);
		});

		// save the old value
		$button.data("value", oldvalue);
	};

	Twinkle.config.listDialog.save = function twinkleconfigListDialogSave(button, tbody) {
		var result = [];
		var current = {};
		$(tbody).find('input[type="text"]').each(function(inputkey, input) {
			if ($(input).hasClass("twinkle-config-customlist-value")) {
				current = {
					value: input.value
				};
			} else {
				current.label = input.value;
				// exclude totally empty rows
				if (current.value || current.label) {
					result.push(current);
				}
			}
		});
		$(button).data("value", result);
	};

	// reset/restore defaults

	Twinkle.config.resetPrefLink = function twinkleconfigResetPrefLink(e) {
		var wantedpref = e.target.id.substring(21); // "twinkle-config-reset-" prefix is stripped

		// search tactics
		$(Twinkle.config.sections).each(function(sectionkey, section) {
			if (section.hidden || (section.adminOnly && !Morebits.userIsInGroup("sysop"))) {
				return true; // continue: skip impossibilities
			}

			var foundit = false;

			$(section.preferences).each(function(prefkey, pref) {
				if (pref.name !== wantedpref) {
					return true; // continue
				}
				Twinkle.config.resetPref(pref, section.inFriendlyConfig);
				foundit = true;
				return false; // break
			});

			if (foundit) {
				return false; // break
			}
		});
		return false; // stop link from scrolling page
	};

	Twinkle.config.resetPref = function twinkleconfigResetPref(pref, inFriendlyConfig) {
		switch (pref.type) {

			case "boolean":
				document.getElementById(pref.name).checked = (inFriendlyConfig ?
					Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]);
				break;

			case "string":
			case "integer":
			case "enum":
				document.getElementById(pref.name).value = (inFriendlyConfig ?
					Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]);
				break;

			case "set":
				$.each(pref.setValues, function(itemkey, itemvalue) {
					if (document.getElementById(pref.name + "_" + itemkey)) {
						document.getElementById(pref.name + "_" + itemkey).checked = ((inFriendlyConfig ?
							Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]).indexOf(itemkey) !== -1);
					}
				});
				break;

			case "customList":
				$(document.getElementById(pref.name)).data("value", (inFriendlyConfig ?
					Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]));
				break;

			default:
				alert("twinkleconfig: unknown data type for preference " + pref.name);
				break;
		}
	};

	Twinkle.config.resetAllPrefs = function twinkleconfigResetAllPrefs() {
		// no confirmation message - the user can just refresh/close the page to abort
		$(Twinkle.config.sections).each(function(sectionkey, section) {
			if (section.hidden || (section.adminOnly && !Morebits.userIsInGroup("sysop"))) {
				return true; // continue: skip impossibilities
			}
			$(section.preferences).each(function(prefkey, pref) {
				if (!pref.adminOnly || Morebits.userIsInGroup("sysop")) {
					Twinkle.config.resetPref(pref, section.inFriendlyConfig);
				}
			});
			return true;
		});
		return false; // stop link from scrolling page
	};

	Twinkle.config.save = function twinkleconfigSave(e) {
		Morebits.status.init(document.getElementById("twinkle-config-content"));

		Morebits.wiki.actionCompleted.notice = "భద్రపరచు";

		var userjs = mw.config.get("wgFormattedNamespaces")[mw.config.get("wgNamespaceIds").user] + ":" + mw.config.get("wgUserName") + "/twinkleoptions.js";
		var wikipedia_page = new Morebits.wiki.page(userjs, "Saving preferences to " + userjs);
		wikipedia_page.setCallbackParameters(e.target);
		wikipedia_page.load(Twinkle.config.writePrefs);

		return false;
	};

	Twinkle.config.writePrefs = function twinkleconfigWritePrefs(pageobj) {
		var form = pageobj.getCallbackParameters();
		var statelem = pageobj.getStatusElement();

		// this is the object which gets serialized into JSON
		var newConfig = {
			twinkle: {},
			friendly: {}
		};

		// keeping track of all preferences that we encounter
		// any others that are set in the user's current config are kept
		// this way, preferences that this script doesn't know about are not lost
		// (it does mean obsolete prefs will never go away, but... ah well...)
		var foundTwinklePrefs = [],
			foundFriendlyPrefs = [];

		// a comparison function is needed later on
		// it is just enough for our purposes (i.e. comparing strings, numbers, booleans,
		// arrays of strings, and arrays of { value, label })
		// and it is not very robust: e.g. compare([2], ["2"]) === true, and
		// compare({}, {}) === false, but it's good enough for our purposes here
		var compare = function(a, b) {
			if ($.isArray(a)) {
				if (a.length !== b.length) {
					return false;
				}
				var asort = a.sort(),
					bsort = b.sort();
				for (var i = 0; asort[i]; ++i) {
					// comparison of the two properties of custom lists
					if ((typeof asort[i] === "object") && (asort[i].label !== bsort[i].label ||
							asort[i].value !== bsort[i].value)) {
						return false;
					} else if (asort[i].toString() !== bsort[i].toString()) {
						return false;
					}
				}
				return true;
			} else {
				return a === b;
			}
		};

		$(Twinkle.config.sections).each(function(sectionkey, section) {
			if (section.adminOnly && !Morebits.userIsInGroup("sysop")) {
				return; // i.e. "continue" in this context
			}

			// reach each of the preferences from the form
			$(section.preferences).each(function(prefkey, pref) {
				var userValue; // = undefined

				// only read form values for those prefs that have them
				if (!section.hidden && (!pref.adminOnly || Morebits.userIsInGroup("sysop"))) {
					switch (pref.type) {

						case "boolean": // read from the checkbox
							userValue = form[pref.name].checked;
							break;

						case "string": // read from the input box or combo box
						case "enum":
							userValue = form[pref.name].value;
							break;

						case "integer": // read from the input box
							userValue = parseInt(form[pref.name].value, 10);
							if (isNaN(userValue)) {
								Morebits.status.warn("Saving", "The value you specified for " + pref.name + " (" + pref.value + ") was invalid.  The save will continue, but the invalid data value will be skipped.");
								userValue = null;
							}
							break;

						case "set": // read from the set of check boxes
							userValue = [];
							if (pref.setDisplayOrder) {
								// read only those keys specified in the display order
								$.each(pref.setDisplayOrder, function(itemkey, item) {
									if (form[pref.name + "_" + item].checked) {
										userValue.push(item);
									}
								});
							} else {
								// read all the keys in the list of values
								$.each(pref.setValues, function(itemkey, itemvalue) {
									if (form[pref.name + "_" + itemkey].checked) {
										userValue.push(itemkey);
									}
								});
							}
							break;

						case "customList": // read from the jQuery data stored on the button object
							userValue = $(form[pref.name]).data("value");
							break;

						default:
							alert("twinkleconfig: unknown data type for preference " + pref.name);
							break;
					}
				}

				// only save those preferences that are *different* from the default
				if (section.inFriendlyConfig) {
					if (userValue !== undefined && !compare(userValue, Twinkle.defaultConfig.friendly[pref.name])) {
						newConfig.friendly[pref.name] = userValue;
					}
					foundFriendlyPrefs.push(pref.name);
				} else {
					if (userValue !== undefined && !compare(userValue, Twinkle.defaultConfig.twinkle[pref.name])) {
						newConfig.twinkle[pref.name] = userValue;
					}
					foundTwinklePrefs.push(pref.name);
				}
			});
		});

		if (Twinkle.prefs) {
			$.each(Twinkle.prefs.twinkle, function(tkey, tvalue) {
				if (foundTwinklePrefs.indexOf(tkey) === -1) {
					newConfig.twinkle[tkey] = tvalue;
				}
			});
			$.each(Twinkle.prefs.friendly, function(fkey, fvalue) {
				if (foundFriendlyPrefs.indexOf(fkey) === -1) {
					newConfig.friendly[fkey] = fvalue;
				}
			});
		}

		var text =
			"// twinkleoptions.js: personal Twinkle preferences file\n" +
			"//\n" +
			"// NOTE: The easiest way to change your Twinkle preferences is by using the\n" +
			"// Twinkle preferences panel, at [[" + mw.config.get("wgPageName") + "]].\n" +
			"//\n" +
			"// This file is AUTOMATICALLY GENERATED.  Any changes you make (aside from\n" +
			"// changing the configuration parameters in a valid-JavaScript way) will be\n" +
			"// overwritten the next time you click \"save\" in the Twinkle preferences\n" +
			"// panel.  If modifying this file, make sure to use correct JavaScript.\n" +
			"\n" +
			"window.Twinkle.prefs = ";
		text += JSON.stringify(newConfig, null, 2);
		text +=
			";\n" +
			"\n" +
			"// End of twinkleoptions.js\n";

		pageobj.setPageText(text);
		pageobj.setEditSummary("Saving Twinkle preferences: automatic edit from [[" + mw.config.get("wgPageName") + "]] ([[WP:TW|TW]])");
		pageobj.setCreateOption("recreate");
		pageobj.save(Twinkle.config.saveSuccess);
	};

	Twinkle.config.saveSuccess = function twinkleconfigSaveSuccess(pageobj) {
		pageobj.getStatusElement().info("successful");

		var noticebox = document.createElement("div");
		noticebox.className = "successbox";
		noticebox.style.fontSize = "100%";
		noticebox.style.marginTop = "2em";
		noticebox.innerHTML = "<p><b>మీ ట్వింకిల్ అభిరుచులను భద్రపరచాం. </b></p><p>మార్పులను చూసేందుకు <b>మీ బౌజరు కాషె ను పూర్తిగా తీసెయ్యాలి</b> (సూచనల కోసం <a href=\"" + mw.util.getUrl("WP:BYPASS") + "\" title=\"WP:BYPASS\">WP:BYPASS</a> చూడండి).</p>";
		Morebits.status.root.appendChild(noticebox);
		var noticeclear = document.createElement("br");
		noticeclear.style.clear = "both";
		Morebits.status.root.appendChild(noticeclear);
	};

	/*
	 ****************************************
	 *** twinkledelimages.js: Batch deletion of images (sysops only)
	 ****************************************
	 * Mode of invocation:     Tab ("Deli-batch")
	 * Active on:              Existing non-special pages
	 * Config directives in:   TwinkleConfig
	 */

	Twinkle.delimages = function twinkledeli() {
		if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgCurRevisionId')) {
			return;
		}
		if (Morebits.userIsInGroup('sysop')) {
			twAddPortletLink(Twinkle.delimages.callback, "Deli-batch", "tw-deli", "Delete files found on page");
		}
	};

	Twinkle.delimages.unlinkCache = {};
	Twinkle.delimages.callback = function twinkledeliCallback() {
		var Window = new Morebits.simpleWindow(800, 400);
		Window.setTitle("మూకుమ్మడిగా దస్త్రాల తొలగింపు");
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#delimages");

		var form = new Morebits.quickForm(Twinkle.delimages.callback.evaluate);
		form.append({
			type: 'checkbox',
			list: [{
				label: 'దస్త్రాలను తొలగించు',
				name: 'delete_image',
				value: 'delete',
				checked: true
			}, {
				label: 'ఈ దస్తానికున్న లింకులను తీసివెయ్యి',
				name: 'unlink_image',
				value: 'unlink',
				checked: true
			}]
		});
		form.append({
			type: 'textarea',
			name: 'reason',
			label: 'కారణం: '
		});
		var query;
		if (mw.config.get('wgNamespaceNumber') === 14) { // వర్గం:
			query = {
				'action': 'query',
				'generator': 'categorymembers',
				'gcmtitle': mw.config.get('wgPageName'),
				'gcmnamespace': 6, // File:
				'gcmlimit': Twinkle.getPref('deliMax'),
				'prop': ['imageinfo', 'categories', 'revisions'],
				'grvlimit': 1,
				'grvprop': ['user']
			};
		} else {
			query = {
				'action': 'query',
				'generator': 'images',
				'titles': mw.config.get('wgPageName'),
				'prop': ['imageinfo', 'categories', 'revisions'],
				'gimlimit': 'max'
			};
		}
		var wikipedia_api = new Morebits.wiki.api('Grabbing files', query, function(self) {
			var xmlDoc = self.responseXML;
			var images = $(xmlDoc).find('page[imagerepository="local"]');
			var list = [];

			$.each(images, function() {
				var $self = $(this);
				var image = $self.attr('title');
				var user = $self.find('imageinfo ii').attr('user');
				var last_edit = $self.find('revisions rev').attr('user');
				var disputed = $self.find('categories cl[title="వర్గం:Contested candidates for speedy deletion"]').length > 0;
				list.push({
					'label': image + ' - author: ' + user + ', last edit from: ' + last_edit + (disputed ? ' DISPUTED' : ''),
					'value': image,
					'checked': !disputed
				});
			});

			self.params.form.append({
				type: 'checkbox',
				name: 'images',
				list: list
			});
			self.params.form.append({
				type: 'submit'
			});

			var result = self.params.form.render();
			self.params.Window.setContent(result);


		});

		wikipedia_api.params = {
			form: form,
			Window: Window
		};
		wikipedia_api.post();
		var root = document.createElement('div');
		Morebits.status.init(root);
		Window.setContent(root);
		Window.display();
	};

	Twinkle.delimages.currentDeleteCounter = 0;
	Twinkle.delimages.currentUnlinkCounter = 0;
	Twinkle.delimages.currentdeletor = 0;
	Twinkle.delimages.callback.evaluate = function twinkledeliCallbackEvaluate(event) {
		mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' ')); // for queen/king/whatever and country!
		var images = event.target.getChecked('images');
		var reason = event.target.reason.value;
		var delete_image = event.target.delete_image.checked;
		var unlink_image = event.target.unlink_image.checked;
		if (!reason) {
			return;
		}

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(event.target);

		function toCall(work) {
			if (work.length === 0 && Twinkle.delimages.currentDeleteCounter <= 0 && Twinkle.delimages.currentUnlinkCounter <= 0) {
				window.clearInterval(Twinkle.delimages.currentdeletor);
				Morebits.wiki.removeCheckpoint();
				return;
			} else if (work.length !== 0 && Twinkle.delimages.currentDeleteCounter <= Twinkle.getPref('batchDeleteMinCutOff') && Twinkle.delimages.currentUnlinkCounter <= Twinkle.getPref('batchDeleteMinCutOff')) {
				Twinkle.delimages.unlinkCache = []; // Clear the cache
				var images = work.shift();
				Twinkle.delimages.currentDeleteCounter = images.length;
				Twinkle.delimages.currentUnlinkCounter = images.length;
				var i;
				for (i = 0; i < images.length; ++i) {
					var image = images[i];
					var query = {
						'action': 'query',
						'titles': image
					};
					var wikipedia_api = new Morebits.wiki.api('దస్త్రం ' + image + ' ఉందో లేదో చూస్తున్నాం', query, Twinkle.delimages.callbacks.main);
					wikipedia_api.params = {
						image: image,
						reason: reason,
						unlink_image: unlink_image,
						delete_image: delete_image
					};
					wikipedia_api.post();
				}
			}
		}
		var work = Morebits.array.chunk(images, Twinkle.getPref('deliChunks'));
		Morebits.wiki.addCheckpoint();
		Twinkle.delimages.currentdeletor = window.setInterval(toCall, 1000, work);
	};
	Twinkle.delimages.callbacks = {
		main: function(self) {
			var xmlDoc = self.responseXML;
			var $data = $(xmlDoc);

			var normal = $data.find('normalized n').attr('to');

			if (normal) {
				self.params.image = normal;
			}

			var exists = $data.find('pages page[title="' + self.params.image.replace(/"/g, '\\"') + '"]:not([missing])').length > 0;

			if (!exists) {
				self.statelem.error("పేజీ అసలు ఉనికిలో లేనట్లుంది, ఈసరికే తొలగించారేమో");
				return;
			}
			if (self.params.unlink_image) {
				var query = {
					'action': 'query',
					'list': 'imageusage',
					'iutitle': self.params.image,
					'iulimit': Morebits.userIsInGroup('sysop') ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
				};
				var wikipedia_api = new Morebits.wiki.api('Grabbing file links', query, Twinkle.delimages.callbacks.unlinkImageInstancesMain);
				wikipedia_api.params = self.params;
				wikipedia_api.post();
			}
			if (self.params.delete_image) {

				var imagepage = new Morebits.wiki.page(self.params.image, 'Deleting image');
				imagepage.setEditSummary("File deleted: " + self.params.reason + Twinkle.getPref('deletionSummaryAd'));
				imagepage.deletePage();
			}
		},
		unlinkImageInstancesMain: function(self) {
			var xmlDoc = self.responseXML;
			var instances = [];
			$(xmlDoc).find('imageusage iu').each(function() {
				instances.push($(this).attr('title'));
			});
			if (instances.length === 0) {
				--twinklebatchdelete.currentUnlinkCounter;
				return;
			}

			$.each(instances, function(k, title) {
				page = new Morebits.wiki.page(title, "Unlinking instances on " + title);
				page.setFollowRedirect(true);
				page.setCallbackParameters({
					'image': self.params.image,
					'reason': self.params.reason
				});
				page.load(Twinkle.delimages.callbacks.unlinkImageInstances);

			});
		},
		unlinkImageInstances: function(self) {
			var params = self.getCallbackParameters();
			var statelem = self.getStatusElement();

			var image = params.image.replace(/^(?:Image|File):/, '');
			var old_text = self.getPageText();
			var wikiPage = new Morebits.wikitext.page(old_text);
			wikiPage.commentOutImage(image, 'బొమ్మను తిసేసినందున కామెంటు చేసేసాం');
			var text = wikiPage.getText();

			if (text === old_text) {
				statelem.error('failed to unlink image ' + image + ' from ' + self.getPageName());
				return;
			}
			self.setPageText(text);
			self.setEditSummary('Removing instance of file ' + image + " that has been deleted because \"" + params.reason + "\")" + "; " + Twinkle.getPref('deletionSummaryAd'));
			self.setCreateOption('nocreate');
			self.save();
		}
	};

	/*
	 ****************************************
	 *** twinkledeprod.js: Batch deletion of expired PRODs (sysops only)
	 ****************************************
	 * Mode of invocation:     Tab ("Deprod")
	 * Active on:              Categories whose name starts with "వర్గం:Proposed deletion as of"
	 * Config directives in:   TwinkleConfig
	 */

	;
	(function() {
		Twinkle.deprod = function() {
			if (mw.config.get('wgNamespaceNumber') !== 14 || !Morebits.userIsInGroup('sysop') || !((/^వర్గం:Proposed_deletion_as_of/).test(mw.config.get('wgPageName')))) {
				return;
			}
			twAddPortletLink(callback, "Deprod", "tw-deprod", "Delete prod pages found in this category");
		};

		var unlinkCache = {},
			concerns = {},
			currentDeleteCounter = 0,
			currentUnlinkCounter = 0,
			currentDeletor = null,

			callback = function() {
				var Window = new Morebits.simpleWindow(800, 400);
				Window.setTitle("PROD శుద్ధి");
				Window.setScriptName("ట్వింకిల్");
				Window.addFooterLink("తొలగింపు ప్రతిపాదన", "WP:PROD");
				Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#deprod");

				var form = new Morebits.quickForm(callback_commit);

				var query = {
					'action': 'query',
					'generator': 'categorymembers',
					'gcmtitle': mw.config.get('wgPageName'),
					'gcmlimit': 5000, // the max for sysops
					'prop': ['categories', 'revisions'],
					'rvprop': ['content']
				};

				var wikipedia_api = new Morebits.wiki.api('Grabbing pages', query,
					function(self) {
						var $doc = $(self.responseXML);
						var $pages = $doc.find('page[ns!="6"]'); // all non-files
						var list = [];
						var re = /\{\{Proposed deletion/;
						$pages.each(function() {
							var $self = $(this);
							var page = $self.attr('title');
							var content = $self.find('revisions rev').text();
							var concern = '';
							var res = re.exec(content);
							if (res) {
								var parsed = Morebits.wikitext.template.parse(content, res.index);
								concern = parsed.parameters.concern || '';
							}
							list.push({
								label: page + ' (' + concern + ')',
								value: page,
								checked: concern !== ''
							});
							concerns[page] = concern;

						});
						self.params.form.append({
							'type': 'checkbox',
							'name': 'pages',
							'list': list
						});
						self.params.form.append({
							'type': 'submit'
						});
						self.params.Window.setContent(self.params.form.render());
					});

				wikipedia_api.params = {
					form: form,
					Window: Window
				};
				wikipedia_api.post();
				var root = document.createElement('div');
				Morebits.simpleWindow.setButtonsEnabled(true);

				Morebits.status.init(root);
				Window.setContent(root);
				Window.display();
			},

			callback_commit = function(event) {
				var pages = event.target.getChecked('pages');
				Morebits.status.init(event.target);

				function toCall(work) {
					if (work.length === 0) {
						Morebits.status.info('పని ఐపోయింది');
						window.clearInterval(currentDeletor);
						Morebits.wiki.removeCheckpoint();
						return;
					} else if (currentDeleteCounter <= 0 || currentUnlinkCounter <= 0) {
						unlinkCache = []; // Clear the cache
						var pages = work.pop(),
							i;
						for (i = 0; i < pages.length; ++i) {
							var page = pages[i];
							var query = {
								'action': 'query',
								'prop': 'revisions',
								'rvprop': ['content'],
								'rvlimit': 1,
								'titles': page
							};
							var wikipedia_api = new Morebits.wiki.api('Checking if page ' + page + ' exists', query, callback_check);
							wikipedia_api.params = {
								page: page,
								reason: concerns[page]
							};
							wikipedia_api.post();
						}
					}
				}
				var work = Morebits.array.chunk(pages, Twinkle.getPref('proddeleteChunks'));
				Morebits.wiki.addCheckpoint();
				currentDeletor = window.setInterval(toCall, 1000, work);
			},
			callback_check = function(self) {
				var $doc = $(self.responseXML);
				var normal = $doc.find('normalized n').attr('to');
				if (normal) {
					self.params.page = normal;
				}
				var exists = $doc.find('pages page:not([missing])').length > 0;

				if (!exists) {
					self.statelem.error("పేజీ అసలు ఉనికిలో లేనట్లుంది, ఈసరికే తొలగించారేమో");
					return;
				}

				var query = {
					'action': 'query',
					'list': 'backlinks',
					'blfilterredir': 'redirects',
					'bltitle': self.params.page,
					'bllimit': Morebits.userIsInGroup('sysop') ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
				};
				var wikipedia_api = new Morebits.wiki.api('Grabbing redirects', query, callback_deleteRedirects);
				wikipedia_api.params = self.params;
				wikipedia_api.post();

				var page = new Morebits.wiki.page('Talk:' + self.params.page, "చర్చ పేజీని తొలగిస్తున్నాం");
				page.setEditSummary("[[WP:CSD#G8|G8]]: తొలగించిన పేజీకి చెందిన [[సహాయం:చర్చ పేజీ|చర్చ పేజీ]] \"" + self.params.page + "\"" + Twinkle.getPref('deletionSummaryAd'));
				page.deletePage();

				page = new Morebits.wiki.page(self.params.page, "వ్యాసాన్ని తొలగిస్తున్నాం");
				page.setEditSummary("Expired [[WP:PROD|PROD]], concern was: " + self.params.reason + Twinkle.getPref('deletionSummaryAd'));
				page.deletePage();


			},
			callback_deleteRedirects = function(self) {
				$doc = $(self.responseXML);
				$doc.find("backlinks bl").each(function() {
					var title = $(this).attr('title');
					var page = new Morebits.wiki.page(title, "దారిమార్పు పేజీని తొలగిస్తున్నాం " + title);
					page.setEditSummary("[[WP:CSD#R1|R1]]: తొలగించిన పేజీకి దారిమార్పు \"" + self.params.page + "\"" + Twinkle.getPref('deletionSummaryAd'));
					page.deletePage();
				});
			};
	}());

	/*
	 ****************************************
	 *** twinklediff.js: Diff module
	 ****************************************
	 * Mode of invocation:     Tab on non-diff pages ("Last"); tabs on diff pages ("Since", "Since mine", "Current")
	 * Active on:              Existing non-special pages
	 * Config directives in:   TwinkleConfig
	 */

	Twinkle.diff = function twinklediff() {
		if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) {
			return;
		}

		var query = {
			'title': mw.config.get('wgPageName'),
			'diff': 'cur',
			'oldid': 'prev'
		};

		twAddPortletLink(mw.util.wikiScript("index") + "?" + $.param(query), 'Last', 'tw-lastdiff', 'Show most recent diff');

		// Show additional tabs only on diff pages
		if (Morebits.queryString.exists('diff')) {
			twAddPortletLink(function() {
				Twinkle.diff.evaluate(false);
			}, 'Since', 'tw-since', 'Show difference between last diff and the revision made by previous user');
			twAddPortletLink(function() {
				Twinkle.diff.evaluate(true);
			}, 'Since mine', 'tw-sincemine', 'Show difference between last diff and my last revision');

			var oldid = /oldid=(.+)/.exec($('#mw-diff-ntitle1').find('strong a').first().attr("href"))[1];
			query = {
				'title': mw.config.get('wgPageName'),
				'diff': 'cur',
				'oldid': oldid
			};
			twAddPortletLink(mw.util.wikiScript("index") + "?" + $.param(query), 'Current', 'tw-curdiff', 'ప్రస్తుత కూర్పుతో ఉన్న తేడాను చూపించు');
		}
	};

	Twinkle.diff.evaluate = function twinklediffEvaluate(me) {

		var user;
		if (me) {
			user = mw.config.get('wgUserName');
		} else {
			var node = document.getElementById('mw-diff-ntitle2');
			if (!node) {
				// nothing to do?
				return;
			}
			user = $(node).find('a').first().text();
		}
		var query = {
			'prop': 'revisions',
			'action': 'query',
			'titles': mw.config.get('wgPageName'),
			'rvlimit': 1,
			'rvprop': ['ids', 'user'],
			'rvstartid': mw.config.get('wgCurRevisionId') - 1, // i.e. not the current one
			'rvuser': user
		};
		Morebits.status.init(document.getElementById('bodyContent'));
		var wikipedia_api = new Morebits.wiki.api('తొలి రచయిత డేటాను సేకరిస్తున్నాం', query, Twinkle.diff.callbacks.main);
		wikipedia_api.params = {
			user: user
		};
		wikipedia_api.post();
	};

	Twinkle.diff.callbacks = {
		main: function(self) {
			var xmlDoc = self.responseXML;
			var revid = $(xmlDoc).find('rev').attr('revid');

			if (!revid) {
				self.statelem.error('సరిపోయే పాత కూర్పు కనిపించలేదు. లేదా ' + self.params.user + ' దీనికున్న ఏకైక రచయిత. ఆపేస్తున్నాం.');
				return;
			}
			var query = {
				'title': mw.config.get('wgPageName'),
				'oldid': revid,
				'diff': mw.config.get('wgCurRevisionId')
			};
			window.location = mw.util.wikiScript('index') + '?' + Morebits.queryString.create(query);
		}
	};

	/*
	 ****************************************
	 *** twinklefluff.js: Revert/rollback module
	 ****************************************
	 * Mode of invocation:     Links on history, contributions, and diff pages
	 * Active on:              Diff pages, history pages, contributions pages
	 * Config directives in:   TwinkleConfig
	 */

	/**
	 Twinklefluff revert and antivandalism utility
	 */

	Twinkle.fluff = {
		auto: function() {
			if (parseInt(Morebits.queryString.get('oldid'), 10) !== mw.config.get('wgCurRevisionId')) {
				// not latest revision
				alert("రోల్‌బ్యాక్ చెయ్యలేం. ఈలోగా పేజీ మారిపోయింది..");
				return;
			}

			var vandal = $("#mw-diff-ntitle2").find("a.mw-userlink").text();

			Twinkle.fluff.revert(Morebits.queryString.get('twinklerevert'), vandal, true);
		},
		normal: function() {

			var spanTag = function(color, content) {
				var span = document.createElement('span');
				span.style.color = color;
				span.appendChild(document.createTextNode(content));
				return span;
			};

			if (mw.config.get('wgNamespaceNumber') === -1 && mw.config.get('wgCanonicalSpecialPageName') === "Contributions") {
				//Get the username these contributions are for
				var href = decodeURIComponent(
					/wiki\/Special:Log\/(.+)$/.exec(
						$('#contentSub').find('a[title^="Special:Log"]').last().attr("href")
					)
				);
				username = href ? href.replace(/_/g, "%20")[1] : null;
				if (username && Twinkle.getPref('showRollbackLinks').indexOf('contribs') !== -1 ||
					(mw.config.get('wgUserName') !== username && Twinkle.getPref('showRollbackLinks').indexOf('others') !== -1) ||
					(mw.config.get('wgUserName') === username && Twinkle.getPref('showRollbackLinks').indexOf('mine') !== -1)) {
					var list = $("#bodyContent").find("ul li:has(span.mw-uctop)");

					var revNode = document.createElement('strong');
					var revLink = document.createElement('a');
					revLink.appendChild(spanTag('Black', '['));
					revLink.appendChild(spanTag('SteelBlue', 'rollback'));
					revLink.appendChild(spanTag('Black', ']'));
					revNode.appendChild(revLink);

					var revVandNode = document.createElement('strong');
					var revVandLink = document.createElement('a');
					revVandLink.appendChild(spanTag('Black', '['));
					revVandLink.appendChild(spanTag('Red', 'vandalism'));
					revVandLink.appendChild(spanTag('Black', ']'));
					revVandNode.appendChild(revVandLink);

					list.each(function(key, current) {
						var href = $(current).children("a:eq(1)").attr("href");
						current.appendChild(document.createTextNode(' '));
						var tmpNode = revNode.cloneNode(true);
						tmpNode.firstChild.setAttribute('href', href + '&' + Morebits.queryString.create({
							'twinklerevert': 'norm'
						}));
						current.appendChild(tmpNode);
						current.appendChild(document.createTextNode(' '));
						tmpNode = revVandNode.cloneNode(true);
						tmpNode.firstChild.setAttribute('href', href + '&' + Morebits.queryString.create({
							'twinklerevert': 'vand'
						}));
						current.appendChild(tmpNode);
					});
				}
			} else {

				if (mw.config.get('wgCanonicalSpecialPageName') === "Undelete") {
					//You can't rollback deleted pages!
					return;
				}

				var body = document.getElementById('bodyContent');

				var firstRev = $("div.firstrevisionheader").length;
				if (firstRev) {
					// we have first revision here, nothing to do.
					return;
				}

				var otitle, ntitle;
				try {
					var otitle1 = document.getElementById('mw-diff-otitle1');
					var ntitle1 = document.getElementById('mw-diff-ntitle1');
					if (!otitle1 || !ntitle1) {
						return;
					}
					otitle = otitle1.parentNode;
					ntitle = ntitle1.parentNode;
				} catch (e) {
					// no old, nor new title, nothing to do really, return;
					return;
				}

				var old_rev_url = $("#mw-diff-otitle1").find("strong a").attr("href");

				// Lets first add a [edit this revision] link
				var query = new Morebits.queryString(old_rev_url.split('?', 2)[1]);

				var oldrev = query.get('oldid');

				var revertToRevision = document.createElement('div');
				revertToRevision.setAttribute('id', 'tw-revert-to-orevision');
				revertToRevision.style.fontWeight = 'bold';

				var revertToRevisionLink = revertToRevision.appendChild(document.createElement('a'));
				revertToRevisionLink.href = "#";
				$(revertToRevisionLink).click(function() {
					Twinkle.fluff.revertToRevision(oldrev);
				});
				revertToRevisionLink.appendChild(spanTag('Black', '['));
				revertToRevisionLink.appendChild(spanTag('SaddleBrown', 'ఈ కూర్పును పునస్థాపించు'));
				revertToRevisionLink.appendChild(spanTag('Black', ']'));

				otitle.insertBefore(revertToRevision, otitle.firstChild);

				if (document.getElementById('differences-nextlink')) {
					// Not latest revision
					curVersion = false;

					var new_rev_url = $("#mw-diff-ntitle1").find("strong a").attr("href");
					query = new Morebits.queryString(new_rev_url.split('?', 2)[1]);
					var newrev = query.get('oldid');
					revertToRevision = document.createElement('div');
					revertToRevision.setAttribute('id', 'tw-revert-to-nrevision');
					revertToRevision.style.fontWeight = 'bold';
					revertToRevisionLink = revertToRevision.appendChild(document.createElement('a'));
					revertToRevisionLink.href = "#";
					$(revertToRevisionLink).click(function() {
						Twinkle.fluff.revertToRevision(newrev);
					});
					revertToRevisionLink.appendChild(spanTag('Black', '['));
					revertToRevisionLink.appendChild(spanTag('SaddleBrown', 'ఈ కూర్పును పునస్థాపించు'));
					revertToRevisionLink.appendChild(spanTag('Black', ']'));
					ntitle.insertBefore(revertToRevision, ntitle.firstChild);

					return;
				}
				if (Twinkle.getPref('showRollbackLinks').indexOf('diff') !== -1) {
					var vandal = $("#mw-diff-ntitle2").find("a").first().text();

					var revertNode = document.createElement('div');
					revertNode.setAttribute('id', 'tw-revert');

					var agfNode = document.createElement('strong');
					var vandNode = document.createElement('strong');
					var normNode = document.createElement('strong');

					var agfLink = document.createElement('a');
					var vandLink = document.createElement('a');
					var normLink = document.createElement('a');

					agfLink.href = "#";
					vandLink.href = "#";
					normLink.href = "#";
					$(agfLink).click(function() {
						Twinkle.fluff.revert('agf', vandal);
					});
					$(vandLink).click(function() {
						Twinkle.fluff.revert('vand', vandal);
					});
					$(normLink).click(function() {
						Twinkle.fluff.revert('norm', vandal);
					});

					agfLink.appendChild(spanTag('Black', '['));
					agfLink.appendChild(spanTag('DarkOliveGreen', 'రోల్‌బ్యాక్ (AGF)'));
					agfLink.appendChild(spanTag('Black', ']'));

					vandLink.appendChild(spanTag('Black', '['));
					vandLink.appendChild(spanTag('Red', 'రోల్‌బ్యాక్ (దుశ్చర్య)'));
					vandLink.appendChild(spanTag('Black', ']'));

					normLink.appendChild(spanTag('Black', '['));
					normLink.appendChild(spanTag('SteelBlue', 'రోల్‌బ్యాక్'));
					normLink.appendChild(spanTag('Black', ']'));

					agfNode.appendChild(agfLink);
					vandNode.appendChild(vandLink);
					normNode.appendChild(normLink);

					revertNode.appendChild(agfNode);
					revertNode.appendChild(document.createTextNode(' || '));
					revertNode.appendChild(normNode);
					revertNode.appendChild(document.createTextNode(' || '));
					revertNode.appendChild(vandNode);

					ntitle.insertBefore(revertNode, ntitle.firstChild);
				}
			}
		}
	};

	Twinkle.fluff.revert = function revertPage(type, vandal, autoRevert, rev, page) {

		var pagename = page || mw.config.get('wgPageName');
		var revid = rev || mw.config.get('wgCurRevisionId');

		Morebits.status.init(document.getElementById('bodyContent'));
		var params = {
			type: type,
			user: vandal,
			pagename: pagename,
			revid: revid,
			autoRevert: !!autoRevert
		};
		var query = {
			'action': 'query',
			'prop': ['info', 'revisions'],
			'titles': pagename,
			'rvlimit': 50, // max possible
			'rvprop': ['ids', 'timestamp', 'user', 'comment'],
			'intoken': 'edit'
		};
		var wikipedia_api = new Morebits.wiki.api('పాత కూర్పుల డేటాను సేకరిస్తున్నాం', query, Twinkle.fluff.callbacks.main);
		wikipedia_api.params = params;
		wikipedia_api.post();
	};

	Twinkle.fluff.revertToRevision = function revertToRevision(oldrev) {

		Morebits.status.init(document.getElementById('bodyContent'));

		var query = {
			'action': 'query',
			'prop': ['info', 'revisions'],
			'titles': mw.config.get('wgPageName'),
			'rvlimit': 1,
			'rvstartid': oldrev,
			'rvprop': ['ids', 'timestamp', 'user', 'comment'],
			'intoken': 'edit',
			'format': 'xml'
		};
		var wikipedia_api = new Morebits.wiki.api('పాత కూర్పు లోని డేటాను సేకరిస్తున్నాం', query, Twinkle.fluff.callbacks.toRevision.main);
		wikipedia_api.params = {
			rev: oldrev
		};
		wikipedia_api.post();
	};

	Twinkle.fluff.userIpLink = function(user) {
		return (Morebits.isIPAddress(user) ? "[[ప్రత్యేక:చేర్పులు/" : "[[వాడుకరి:") + user + "|" + user + "]]";
	};

	Twinkle.fluff.callbacks = {
		toRevision: {
			main: function(self) {
				var xmlDoc = self.responseXML;

				var lastrevid = parseInt($(xmlDoc).find('page').attr('lastrevid'), 10);
				var touched = $(xmlDoc).find('page').attr('touched');
				var starttimestamp = $(xmlDoc).find('page').attr('starttimestamp');
				var edittoken = $(xmlDoc).find('page').attr('edittoken');
				var revertToRevID = $(xmlDoc).find('rev').attr('revid');
				var revertToUser = $(xmlDoc).find('rev').attr('user');

				if (revertToRevID !== self.params.rev) {
					self.statitem.error('తెచ్చిన కూర్పు, అడిగిన కూర్పుతో సరిపోలడం లేదు. ఆపేస్తున్నాం.');
					return;
				}

				var optional_summary = prompt("Please specify a reason for the revert:                                ", ""); // padded out to widen prompt in Firefox
				if (optional_summary === null) {
					self.statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
					return;
				}
				var summary = "Reverted to revision " + revertToRevID + " by " + revertToUser + (optional_summary ? ": " + optional_summary : '') + "." +
					Twinkle.getPref('summaryAd');

				var query = {
					'action': 'edit',
					'title': mw.config.get('wgPageName'),
					'summary': summary,
					'token': edittoken,
					'undo': lastrevid,
					'undoafter': revertToRevID,
					'basetimestamp': touched,
					'starttimestamp': starttimestamp,
					'watchlist': Twinkle.getPref('watchRevertedPages').indexOf(self.params.type) !== -1 ? 'watch' : undefined,
					'minor': Twinkle.getPref('markRevertedPagesAsMinor').indexOf(self.params.type) !== -1 ? true : undefined
				};

				Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
				Morebits.wiki.actionCompleted.notice = "తిరగవేత పూర్తయింది";

				var wikipedia_api = new Morebits.wiki.api('Saving reverted contents', query, Twinkle.fluff.callbacks.complete, self.statelem);
				wikipedia_api.params = self.params;
				wikipedia_api.post();

			}
		},
		main: function(self) {
			var xmlDoc = self.responseXML;

			var lastrevid = parseInt($(xmlDoc).find('page').attr('lastrevid'), 10);
			var touched = $(xmlDoc).find('page').attr('touched');
			var starttimestamp = $(xmlDoc).find('page').attr('starttimestamp');
			var edittoken = $(xmlDoc).find('page').attr('edittoken');
			var lastuser = $(xmlDoc).find('rev').attr('user');

			var revs = $(xmlDoc).find('rev');

			if (revs.length < 1) {
				self.statelem.error('ఇంకా ఒకటి కంటే తక్కువ కూర్పులు ఉన్నాయి. అంచేత ఇక వెనక్కి తిప్పడం అసాధ్యం');
				return;
			}
			var top = revs[0];
			if (lastrevid < self.params.revid) {
				Morebits.status.error('Error', ['The most recent revision ID received from the server, ', Morebits.htmlNode('strong', lastrevid), ', is less than the ID of the displayed revision. This could indicate that the current revision has been deleted, the server is lagging, or that bad data has been received. Will stop proceeding at this point.']);
				return;
			}
			var index = 1;
			if (self.params.revid !== lastrevid) {
				Morebits.status.warn('Warning', ['Latest revision ', Morebits.htmlNode('strong', lastrevid), ' doesn\'t equal our revision ', Morebits.htmlNode('strong', self.params.revid)]);
				if (lastuser === self.params.user) {
					switch (self.params.type) {
						case 'vand':
							Morebits.status.info('Info', ['చిట్టచివరి కూర్పును చేసినది: ', Morebits.htmlNode('strong', self.params.user), '. దుశ్చర్య జరిగినట్లు భావిస్తున్నాం, తిరగవేతను కొనసాగిస్తాం']);
							break;
						case 'agf':
							Morebits.status.warn('Warning', ['చిట్టచివరి కూర్పును చేసినది: ', Morebits.htmlNode('strong', self.params.user), '. సదుద్దేశాన్ని ఆపాదించుకుంటూ, సమస్య పరిష్కారమై ఉంటుందని భావిస్తూ తిరగవేతను ఆపేస్తున్నాం.']);
							return;
						default:
							Morebits.status.warn('Notice', ['చిట్టచివరి కూర్పును చేసినది: ', Morebits.htmlNode('strong', self.params.user), ', ఏదేమైనా, తిరగవేతను ఆపేస్తాం.']);
							return;
					}
				} else if (self.params.type === 'vand' &&
					Twinkle.fluff.whiteList.indexOf(top.getAttribute('user')) !== -1 && revs.length > 1 &&
					revs[1].getAttribute('pageId') === self.params.revid) {
					Morebits.status.info('Info', ['చిట్టచివరి కూర్పును చేసినది: ', Morebits.htmlNode('strong', lastuser), ', ఒక విశ్వసనీయమైన బాట్, దానికి ముందరి కూర్పును చేసినది మాత్రం మన దుష్టులే. అంచేత మేం వెనక్కి తిప్పడం చేసేస్తాం.']);
					index = 2;
				} else {
					Morebits.status.error('Error', ['చిట్టచివరి కూర్పును చేసినది: ', Morebits.htmlNode('strong', lastuser), ', అంచేత దాన్ని ఈసరికే తిరగగొట్టి ఉండవచ్చు. తిరగవేతను ఆపేస్తున్నాం.']);
					return;
				}

			}

			if (Twinkle.fluff.whiteList.indexOf(self.params.user) !== -1) {
				switch (self.params.type) {
					case 'vand':
						Morebits.status.info('Info', ['Vandalism revert was chosen on ', Morebits.htmlNode('strong', self.params.user), '. As this is a whitelisted bot, we assume you wanted to revert vandalism made by the previous user instead.']);
						index = 2;
						vandal = revs[1].getAttribute('user');
						self.params.user = revs[1].getAttribute('user');
						break;
					case 'agf':
						Morebits.status.warn('Notice', ['Good faith revert was chosen on ', Morebits.htmlNode('strong', self.params.user), '. This is a whitelisted bot, and since bots have no faith, AGF rollback will not proceed.']);
						return;
					case 'norm':
						/* falls through */
					default:
						var cont = confirm('Normal revert was chosen, but the most recent edit was made by a whitelisted bot (' + self.params.user + '). Do you want to revert the revision before instead?');
						if (cont) {
							Morebits.status.info('Info', ['Normal revert was chosen on ', Morebits.htmlNode('strong', self.params.user), '. This is a whitelisted bot, and per confirmation, we\'ll revert the previous revision instead.']);
							index = 2;
							self.params.user = revs[1].getAttribute('user');
						} else {
							Morebits.status.warn('Notice', ['Normal revert was chosen on ', Morebits.htmlNode('strong', self.params.user), '. This is a whitelisted bot, but per confirmation, revert on top revision will proceed.']);
						}
						break;
				}
			}
			var found = false;
			var count = 0;

			for (var i = index; i < revs.length; ++i) {
				++count;
				if (revs[i].getAttribute('user') !== self.params.user) {
					found = i;
					break;
				}
			}

			if (!found) {
				self.statelem.error(['గత కూర్పులేమీ కనబడలేదు. బహుశా దిద్దుబాటు చేసిన వాడుకరి ', Morebits.htmlNode('strong', self.params.user), ' ఒక్కరేనేమో. లేదా వాడుకరి వరసబెట్టి ' + Twinkle.getPref('revertMaxRevisions') + ' కంటే ఎక్కువ దిద్దుబాట్లు చేసారేమో.']);
				return;
			}

			if (!count) {
				Morebits.status.error('Error', "We were to revert zero revisions. As that makes no sense, we'll stop reverting this time. It could be that the edit has already been reverted, but the revision ID was still the same.");
				return;
			}

			var good_revision = revs[found];
			var userHasAlreadyConfirmedAction = false;
			if (self.params.type !== 'vand' && count > 1) {
				if (!confirm(self.params.user + ' వరసబెట్టి ' + count + ' దిద్దుబాట్లు చేసారు. వాటన్నిటినీ వెనక్కి తిపాలనే మీరు నిశ్చయించుకున్నారా ?')) {
					Morebits.status.info('Notice', 'వాడుకరి ఇచ్చిన ఇన్‌పుట్ మేరకు తిరగవేతను ఆపేస్తున్నాం');
					return;
				}
				userHasAlreadyConfirmedAction = true;
			}

			self.params.count = count;

			self.params.goodid = good_revision.getAttribute('revid');
			self.params.gooduser = good_revision.getAttribute('user');

			self.statelem.status([' revision ', Morebits.htmlNode('strong', self.params.goodid), ' that was made ', Morebits.htmlNode('strong', count), ' revisions ago by ', Morebits.htmlNode('strong', self.params.gooduser)]);

			var summary, extra_summary, userstr, gooduserstr;
			switch (self.params.type) {
				case 'agf':
					extra_summary = prompt("దిద్దుబాటు సారాంశం కోసం ఐచ్ఛిక వ్యాఖ్య:                              ", ""); // padded out to widen prompt in Firefox
					if (extra_summary === null) {
						self.statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
						return;
					}
					userHasAlreadyConfirmedAction = true;

					userstr = self.params.user;
					summary = "[[Special:Contributions/" + userstr + "|" + userstr + "]] ([[User talk:" +
						userstr + "|చర్చ]]) [[WP:AGF|సదుద్దేశంతో]] చేసిన దిద్దుబాటును వెనక్కి తిప్పారు" + Twinkle.fluff.formatSummaryPostfix(extra_summary) + Twinkle.getPref('summaryAd');
					break;

				case 'vand':

					userstr = self.params.user;
					gooduserstr = self.params.gooduser;
					summary = "Reverted " + self.params.count + (self.params.count > 1 ? ' edits' : ' edit') + " by [[Special:Contributions/" +
						userstr + "|" + userstr + "]] ([[User talk:" + userstr + "|talk]]) identified as [[WP:VAND|vandalism]] to last revision by " +
						gooduserstr + "." + Twinkle.getPref('summaryAd');
					break;

				case 'norm':
					/* falls through */
				default:
					if (Twinkle.getPref('offerReasonOnNormalRevert')) {
						extra_summary = prompt("దిద్దుబాటు సారాంశం కోసం ఐచ్ఛిక వ్యాఖ్య::                              ", ""); // padded out to widen prompt in Firefox
						if (extra_summary === null) {
							self.statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
							return;
						}
						userHasAlreadyConfirmedAction = true;
					}

					userstr = self.params.user;
					summary = "[[Special:Contributions/" +
						userstr + "|" + userstr + "]] ([[User talk:" + userstr + "|talk]]) చేసిన"  + self.params.count + (self.params.count > 1 ? ' దిద్దుబాట్లను' : ' దిద్దుబాటును') + "వెనక్కి తిప్పారు "+ Twinkle.fluff.formatSummaryPostfix(extra_summary) +
						Twinkle.getPref('summaryAd');
					break;
			}

			if (Twinkle.getPref('confirmOnFluff') && !userHasAlreadyConfirmedAction && !confirm("Reverting page: are you sure?")) {
				self.statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
				return;
			}

			var query;
			if ((!self.params.autoRevert || Twinkle.getPref('openTalkPageOnAutoRevert')) &&
				Twinkle.getPref('openTalkPage').indexOf(self.params.type) !== -1 &&
				mw.config.get('wgUserName') !== self.params.user) {
				Morebits.status.info('Info', ['వాడుకరి కోసం వాడుకరి చర్చ పేజీని దిద్దుబాటు స్థితిలో తెరుస్తున్నాం ', Morebits.htmlNode('strong', self.params.user)]);

				query = {
					'title': 'User talk:' + self.params.user,
					'action': 'edit',
					'preview': 'yes',
					'vanarticle': self.params.pagename.replace(/_/g, ' '),
					'vanarticlerevid': self.params.revid,
					'vanarticlegoodrevid': self.params.goodid,
					'type': self.params.type,
					'count': self.params.count
				};

				switch (Twinkle.getPref('userTalkPageMode')) {
					case 'tab':
						window.open(mw.util.wikiScript('index') + '?' + Morebits.queryString.create(query), '_tab');
						break;
					case 'blank':
						window.open(mw.util.wikiScript('index') + '?' + Morebits.queryString.create(query), '_blank', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800');
						break;
					case 'window':
						/* falls through */
					default:
						window.open(mw.util.wikiScript('index') + '?' + Morebits.queryString.create(query), 'twinklewarnwindow', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800');
						break;
				}
			}

			query = {
				'action': 'edit',
				'title': self.params.pagename,
				'summary': summary,
				'token': edittoken,
				'undo': lastrevid,
				'undoafter': self.params.goodid,
				'basetimestamp': touched,
				'starttimestamp': starttimestamp,
				'watchlist': Twinkle.getPref('watchRevertedPages').indexOf(self.params.type) !== -1 ? 'watch' : undefined,
				'minor': Twinkle.getPref('markRevertedPagesAsMinor').indexOf(self.params.type) !== -1 ? true : undefined
			};

			Morebits.wiki.actionCompleted.redirect = self.params.pagename;
			Morebits.wiki.actionCompleted.notice = "తిరగవేత పూర్తయింది";

			var wikipedia_api = new Morebits.wiki.api('తిరగగొట్టిన కంటెంటును భద్రపరుస్తున్నాం', query, Twinkle.fluff.callbacks.complete, self.statelem);
			wikipedia_api.params = self.params;
			wikipedia_api.post();

		},
		complete: function(apiobj) {
			var blacklist = $(apiobj.getXML()).find('edit').attr('spamblacklist');
			if (blacklist) {
				var code = document.createElement('code');
				code.style.fontFamily = "monospace";
				code.appendChild(document.createTextNode(blacklist));
				apiobj.statelem.error(['URL ', code, ' స్పాము బ్లాక్‌లిస్టులో ఉన్నందున దీన్ని రోల్‌బ్యాక్ చెయ్యలేము.']);
			} else {
				apiobj.statelem.info("అయిపోయింది");
			}
		}
	};

	Twinkle.fluff.formatSummaryPostfix = function(stringToAdd) {
		if (stringToAdd) {
			stringToAdd = ': ' + Morebits.string.toUpperCaseFirstChar(stringToAdd);
			if (stringToAdd.search(/[.?!;]$/) === -1) {
				stringToAdd = stringToAdd + '.';
			}
			return stringToAdd;
		} else {
			return '.';
		}
	};

	Twinkle.fluff.init = function twinklefluffinit() {
		if (twinkleUserAuthorized) {
			// a list of usernames, usually only bots, that vandalism revert is jumped over, that is
			// if vandalism revert was chosen on such username, then it's target is on the revision before.
			// This is for handeling quick bots that makes edits seconds after the original edit is made.
			// This only affect vandalism rollback, for good faith rollback, it will stop, indicating a bot 
			// has no faith, and for normal rollback, it will rollback that edit.
			Twinkle.fluff.whiteList = [
				'AnomieBOT',
				'ClueBot NG',
				'SineBot'
			];

			if (Morebits.queryString.exists('twinklerevert')) {
				Twinkle.fluff.auto();
			} else {
				Twinkle.fluff.normal();
			}
		}
	};

	/*
	 ****************************************
	 *** twinkleimage.js: Image CSD module
	 ****************************************
	 * Mode of invocation:     Tab ("DI")
	 * Active on:              File pages with a corresponding file which is local (not on Commons)
	 * Config directives in:   TwinkleConfig
	 */

	Twinkle.image = function twinkleimage() {
		if (mw.config.get('wgNamespaceNumber') === 6 &&
			!document.getElementById("mw-sharedupload") &&
			document.getElementById("mw-imagepage-section-filehistory")) {

			twAddPortletLink(Twinkle.image.callback, "DI", "tw-di", "Nominate file for delayed speedy deletion");
		}
	};

	Twinkle.image.callback = function twinkleimageCallback() {
		if (!twinkleUserAuthorized) {
			alert("మీ ఖాతా మరీ కొత్తది, ట్వింకిల్ వాడలేరు.");
			return;
		}
		var Window = new Morebits.simpleWindow(600, 300);
		Window.setTitle("సత్వర తొలగింపు కోసం దస్త్రం");
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("సత్వర తొలగింపు విధానం", "WP:CSD");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#image");

		var form = new Morebits.quickForm(Twinkle.image.callback.evaluate);
		form.append({
			type: 'checkbox',
			list: [{
				label: 'ఒరిజినలుగా ఎక్కించినవారికి తెలియపరచు',
				value: 'notify',
				name: 'notify',
				tooltip: "మీరు ఒకే వాడుకరిపై అనేక ఫిర్యాదులు చెయ్యదలిస్తే, వారి వాడుకరి చర్చ పేజీని మరీ ఎక్కువ గమనింపులతో ముంచెత్తకుండా ఉండాలంటే, దీనిలో టిక్కు తీసెయ్యండి.",
				checked: Twinkle.getPref('notifyUserOnDeli')
			}]
		});
		var field = form.append({
			type: 'field',
			label: 'తీసుకోదలచిన చర్య రకం'
		});
		field.append({
			type: 'radio',
			name: 'type',
			event: Twinkle.image.callback.choice,
			list: [{
				label: 'మూలం లేదు (CSD F4)',
				value: 'no source',
				checked: true,
				tooltip: 'మీడియా దస్త్రానికి మూలం గురించిన సమాచారం లేదు'
			}, {
				label: 'లైసెన్సు లేదు (CSD F4)',
				value: 'no license',
				tooltip: 'మీడియా దస్త్రానికి కాపీహక్కుల గురించిన సమాచారం లేదు'
			}, {
				label: 'మూలం లేదు, లైసెన్సూ లేదు (CSD F4)',
				value: 'no source no license',
				tooltip: 'మీడియా దస్త్రానికి మూలం గురించి గాని, కాపీహక్కుల గురించి గానీ సమాచారమేమీ లేదు'
			}, {
				label: 'అనాథైన సముచిత వినియోగ దస్త్రం (CSD F5)',
				value: 'orphaned fair use',
				tooltip: 'Image or media is unlicensed for use on Wikipedia and allowed only under a claim of fair use per Wikipedia:Non-free content, but it is not used in any articles'
			}, {
				label: 'సముచిత వినియోగ హేతువు లేదు (CSD F6)',
				value: 'no fair use rationale',
				tooltip: 'Image or media is claimed to be used under Wikipedia\'s fair use policy but has no explanation as to why it is permitted under the policy'
			}, {
				label: 'వివాదాస్పదమైన సముచిత వినియోగ హేతువు (CSD F7)',
				value: 'disputed fair use rationale',
				tooltip: 'ఈ దస్త్రపు సముచిత వినియోగ హేతువు వివాదాస్పదంగా ఉంది'
			}, {
				label: 'మార్చదగ్గ సముచిత వినియోగ దస్త్రం (CSD F7)',
				value: 'replaceable fair use',
				tooltip: 'Image or media may fail Wikipedia\'s first non-free content criterion ([[WP:NFCC#1]]) in that it illustrates a subject for which a free image might reasonably be found or created that adequately provides the same information'
			}, {
				label: 'అనుమతులున్నట్లు ఆధారం లేదు (CSD F11)',
				value: 'no permission',
				tooltip: 'ఈ దస్త్రపు కర్త అనుమతు లిచ్చిన్నట్లుగా ఆధారమేమీ లేదు'
			}]
		});
		form.append({
			type: 'div',
			label: 'Work area',
			name: 'work_area'
		});
		form.append({
			type: 'submit'
		});

		var result = form.render();
		Window.setContent(result);
		Window.display();

		// We must init the parameters
		var evt = document.createEvent("Event");
		evt.initEvent('change', true, true);
		result.type[0].dispatchEvent(evt);
	};

	Twinkle.image.callback.choice = function twinkleimageCallbackChoose(event) {
		var value = event.target.values;
		var root = event.target.form;
		var work_area = new Morebits.quickForm.element({
			type: 'div',
			name: 'work_area'
		});

		switch (value) {
			case 'no source no license':
			case 'no source':
				work_area.append({
					type: 'checkbox',
					name: 'non_free',
					list: [{
						label: 'ఉచితం కాని',
						tooltip: 'బొమ్మను సముచిత వినియోగం లైసెన్సు ఉందని అంటున్నారు'
					}]
				});
				break;
			case 'no permission':
				work_area.append({
					type: 'input',
					name: 'source',
					label: 'మూలం: '
				});
				break;
			case 'disputed fair use rationale':
				work_area.append({
					type: 'textarea',
					name: 'reason',
					label: 'ఆందోళన: '
				});
				break;
			case 'orphaned fair use':
				work_area.append({
					type: 'input',
					name: 'replacement',
					label: 'Replacement: '
				});
				break;
			case 'replaceable fair use':
				work_area.append({
					type: 'checkbox',
					name: 'old_image',
					list: [{
						label: 'పాత బొమ్మ',
						tooltip: 'బొమ్మ 2006-07-13 కంటే ముందు ఎక్కించినది'
					}]
				});
				break;
			default:
				break;
		}

		root.replaceChild(work_area.render(), $(root).find('div[name="work_area"]')[0]);
	};

	Twinkle.image.callback.evaluate = function twinkleimageCallbackEvaluate(event) {
		var type, non_free, source, reason, replacement, old_image;
		mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' ')); // for queen/king/whatever and country!

		var notify = event.target.notify.checked;
		var types = event.target.type;
		for (var i = 0; i < types.length; ++i) {
			if (types[i].checked) {
				type = types[i].values;
				break;
			}
		}
		if (event.target.non_free) {
			non_free = event.target.non_free.checked;
		}
		if (event.target.source) {
			source = event.target.source.value;
		}
		if (event.target.reason) {
			reason = event.target.reason.value;
		}
		if (event.target.replacement) {
			replacement = event.target.replacement.value;
		}
		if (event.target.old_image) {
			old_image = event.target.old_image.checked;
		}

		var csdcrit;
		switch (type) {
			case 'no source no license':
			case 'no source':
			case 'no license':
				csdcrit = "F4";
				break;
			case 'orphaned fair use':
				csdcrit = "F5";
				break;
			case 'no fair use rationale':
				csdcrit = "F6";
				break;
			case 'disputed fair use rationale':
			case 'replaceable fair use':
				csdcrit = "F7";
				break;
			case 'no permission':
				csdcrit = "F11";
				break;
			default:
				throw new Error("Twinkle.image.callback.evaluate: unknown criterion");
		}

		var lognomination = Twinkle.getPref('logSpeedyNominations') && Twinkle.getPref('noLogOnSpeedyNomination').indexOf(csdcrit.toLowerCase()) === -1;

		var params = {
			'type': type,
			'normalized': csdcrit,
			'non_free': non_free,
			'source': source,
			'reason': reason,
			'replacement': replacement,
			'old_image': old_image,
			'lognomination': lognomination
		};
		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(event.target);

		Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
		Morebits.wiki.actionCompleted.notice = "ట్యాగులు పెట్టడం పూర్తయింది";

		// Tagging image
		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'Tagging file with deletion tag');
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.load(Twinkle.image.callbacks.taggingImage);

		// Notifying uploader
		if (notify) {
			wikipedia_page.lookupCreator(Twinkle.image.callbacks.userNotification);
		} else {
			// add to CSD log if desired
			if (lognomination) {
				params.fromDI = true;
				Twinkle.speedy.callbacks.user.addToLog(params, null);
			}
			// No auto-notification, display what was going to be added.
			var noteData = document.createElement('pre');
			noteData.appendChild(document.createTextNode("{{subst:di-" + type + "-notice|1=" + mw.config.get('wgTitle') + "}} ~~~~"));
			Morebits.status.info('Notification', ['కింది డేటాను లేదా ఇలాంటి డేటాను ఒరిజినల్‌గా ఎక్కించినవారికి పంపాలి:', document.createElement('br'), noteData]);
		}
	};

	Twinkle.image.callbacks = {
		taggingImage: function(pageobj) {
			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();

			// remove "move to Commons" tag - deletion-tagged files cannot be moved to Commons
			text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, "");

			var tag = "{{di-" + params.type + "|date={{subst:#time:Y F j}}";
			switch (params.type) {
				case 'no source no license':
				case 'no source':
					tag += params.non_free ? "|non-free=yes" : "";
					break;
				case 'no permission':
					tag += params.source ? "|source=" + params.source : "";
					break;
				case 'disputed fair use rationale':
					tag += params.reason ? "|concern=" + params.reason : "";
					break;
				case 'orphaned fair use':
					tag += params.replacement ? "|replacement=" + params.replacement : "";
					break;
				case 'replaceable fair use':
					tag += params.old_image ? "|old image=yes" : "";
					break;
				default:
					break; // doesn't matter
			}
			tag += "}}\n";

			pageobj.setPageText(tag + text);
			pageobj.setEditSummary("ఈ దస్త్రం తొలగింపు ప్రతిపాదనలో ఉంది. చూడండి: [[WP:CSD#" + params.normalized + "|CSD " + params.normalized + "]] (" + params.type + ")." + Twinkle.getPref('summaryAd'));
			switch (Twinkle.getPref('deliWatchPage')) {
				case 'yes':
					pageobj.setWatchlist(true);
					break;
				case 'no':
					pageobj.setWatchlistFromPreferences(false);
					break;
				default:
					pageobj.setWatchlistFromPreferences(true);
					break;
			}
			pageobj.setCreateOption('nocreate');
			pageobj.save();
		},
		userNotification: function(pageobj) {
			var params = pageobj.getCallbackParameters();
			var initialContrib = pageobj.getCreator();
			var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "తొలి రచయితకు తెలియపరుస్తున్నాం (" + initialContrib + ")");
			var notifytext = "\n{{subst:di-" + params.type + "-notice|1=" + mw.config.get('wgTitle');
			if (params.type === 'no permission') {
				notifytext += params.source ? "|source=" + params.source : "";
			}
			notifytext += "}} ~~~~";
			usertalkpage.setAppendText(notifytext);
			usertalkpage.setEditSummary("గమనింపు: [[" + mw.config.get('wgPageName') + "]] తొలగింపు ట్యాగును చేరుస్తున్నాం." + Twinkle.getPref('summaryAd'));
			usertalkpage.setCreateOption('recreate');
			switch (Twinkle.getPref('deliWatchUser')) {
				case 'yes':
					usertalkpage.setWatchlist(true);
					break;
				case 'no':
					usertalkpage.setWatchlistFromPreferences(false);
					break;
				default:
					usertalkpage.setWatchlistFromPreferences(true);
					break;
			}
			usertalkpage.setFollowRedirect(true);
			usertalkpage.append();

			// add this nomination to the user's userspace log, if the user has enabled it
			if (params.lognomination) {
				params.fromDI = true;
				Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
			}
		}
	};

	/*
	 ****************************************
	 *** twinkleprod.js: PROD module
	 ****************************************
	 * Mode of invocation:     Tab ("PROD")
	 * Active on:              Existing articles which are not redirects
	 * Config directives in:   TwinkleConfig
	 */

	Twinkle.prod = function twinkleprod() {
		if (mw.config.get('wgNamespaceNumber') !== 0 || !mw.config.get('wgCurRevisionId') || Morebits.wiki.isPageRedirect()) {
			return;
		}

		twAddPortletLink(Twinkle.prod.callback, "PROD", "tw-prod", "Propose deletion via WP:PROD");
	};

	Twinkle.prod.callback = function twinkleprodCallback() {
		if (!twinkleUserAuthorized) {
			alert("మీ ఖాతా మరీ కొత్తది, ట్వింకిల్ వాడలేరు.");
			return;
		}
		Twinkle.prod.defaultReason = Twinkle.getPref('prodReasonDefault');

		var Window = new Morebits.simpleWindow(800, 410);
		Window.setTitle("తొలగింపుకు ప్రతిపాదన");
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("తొలగింపు ప్రతిపాదన విధానం", "WP:PROD");
		Window.addFooterLink("BLP PROD విధానం", "WP:BLPPROD");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#prod");

		var form = new Morebits.quickForm(Twinkle.prod.callback.evaluate);

		var field = form.append({
			type: 'field',
			label: 'PROD రకం'
		});
		field.append({
			type: 'radio',
			name: 'prodtype',
			event: Twinkle.prod.callback.prodtypechanged,
			list: [{
				label: 'PROD (తొలగింపు ప్రతిపాదన)',
				value: 'prod',
				checked: true,
				tooltip: '[[WP:PROD]] ప్రకారం చేసే మామూలు తొలగింపు ప్రతిపాదన'
			}, {
				label: 'BLP PROD (మూలాల్లేని, జీవించి ఉన్న వ్యక్తుల జీవిత చరిత్ర వ్యాసాల తొలగింపు ప్రతిపాదన)',
				value: 'prodblp',
				tooltip: 'కొత్తగా సృష్టించిన, అసలు ఒక్క మూలం కూడా లేని, జీవించి ఉన్న వ్యక్తుల జీవిత చరిత్ర వ్యాసాలు, [[WP:BLPPROD]] ప్రకారం'
			}]
		});

		form.append({
			type: 'field',
			label: 'Work area',
			name: 'work_area'
		});

		form.append({
			type: 'submit',
			label: 'తొలగింపుకు ప్రతిపాదించు'
		});

		var result = form.render();
		Window.setContent(result);
		Window.display();

		// fake a change event on the first prod type radio, to initialize the type-dependent controls
		var evt = document.createEvent("Event");
		evt.initEvent('change', true, true);
		result.prodtype[0].dispatchEvent(evt);
	};

	Twinkle.prod.callback.prodtypechanged = function(event) {
		//prepare frame for prod type dependant controls
		var field = new Morebits.quickForm.element({
			type: 'field',
			label: 'పరామితులు',
			name: 'work_area'
		});
		// create prod type dependant controls
		switch (event.target.values) {
			case 'prod':
				field.append({
					type: 'checkbox',
					list: [{
						label: 'వీలైతే ఈ పేజీని సృష్టించిన సభ్యునికి సందేశం పంపు',
						value: 'notify',
						name: 'notify',
						tooltip: "దీనిలో టిక్కు పెడితే, పేజీని సృష్టించిన వారి చర్చ పేజీలో ఒక గమనింపు మూసను పెడతాం.",
						checked: true
					}]
				});
				field.append({
					type: 'textarea',
					name: 'reason',
					label: 'తొలగింపు ప్రతిపాదనకు కారణం:',
					value: Twinkle.prod.defaultReason
				});
				break;

			case 'prodblp':
				// first, remember the prod value that the user entered in the textarea, in case he wants to switch back. We can abuse the config field for that.
				if (event.target.form.reason) {
					Twinkle.prod.defaultReason = event.target.form.reason.value;
				}

				field.append({
					type: 'checkbox',
					list: [{
						label: 'వీలైతే ఈ పేజీని సృష్టించిన సభ్యునికి సందేశం పంపు',
						value: 'notify',
						name: 'notify',
						tooltip: 'వ్యాస సృష్టికర్తకు తెలియపరచాలి.',
						checked: true,
						disabled: true
					}]
				});
				//temp warning, can be removed down the line once BLPPROD is more established. Amalthea, May 2010.
				var boldtext = document.createElement('b');
				boldtext.appendChild(document.createTextNode('మూలాల్లేని, జీవించి ఉన్న వ్యక్తుల జీవిత చరిత్ర వ్యాసాలకు మాత్రమే ఈ ట్యాగు వర్తిస్తుందని గమనించండి. .'));
				field.append({
					type: 'div',
					label: boldtext
				});
				if (mw.config.get('wgArticleId') < 26596183) {
					field.append({
						type: 'header',
						label: 'ఈ వ్యాసాన్ని 2010 మార్చి 18 కంటే ముందు సృష్టించినట్లు తెలుస్తోంది. అంచేత ఇది BLP PROD కు అర్హమైనది కాదు. ఇది అవునో కాదో నిర్ధారించుకోండి. లేదా మామూలు PROD ను ఎంచుకోండి.'
					});
				}
				break;

			default:
				break;
		}

		event.target.form.replaceChild(field.render(), $(event.target.form).find('fieldset[name="work_area"]')[0]);
	};

	Twinkle.prod.callbacks = {
		main: function(pageobj) {
			var statelem = pageobj.getStatusElement();

			if (!pageobj.exists()) {
				statelem.error("It seems that the page doesn't exist.  Perhaps it has already been deleted.");
				return;
			}

			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();

			var tag_re = /(\{\{(?:db-?|delete|[aitcmrs]fd|md1)[^{}]*?\|?[^{}]*?\}\})/i;
			if (tag_re.test(text)) {
				statelem.warn('Page already tagged with a deletion template, aborting procedure');
				return;
			}

			// Remove tags that become superfluous with this action
			text = text.replace(/\{\{\s*(New unreviewed article|Userspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");

			var prod_re = /\{\{\s*(?:dated prod|dated prod blp|Prod blp\/dated|Proposed deletion\/dated)\s*\|(?:\{\{[^\{\}]*\}\}|[^\}\{])*\}\}/i;
			var summaryText;
			if (!prod_re.test(text)) {
				// Notification to first contributor
				if (params.usertalk) {
					var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
					thispage.setCallbackParameters(params);
					thispage.lookupCreator(Twinkle.prod.callbacks.userNotification);
				}
				// If not notifying, log this PROD
				else if (Twinkle.getPref('logProdPages')) {
					Twinkle.prod.callbacks.addToLog(params, null);
				}

				summaryText = "ఈ వ్యాసాన్ని [[WP:" + (params.blp ? "BLP" : "") + "PROD]] ప్రకారం తొలగింపుకు ప్రతిపాదించారు";
				text = "{{subst:తొలగించు" + (params.blp ? " blp" : ("|1=" + params.reason)) + "}}\n" + text;
			} else { // already tagged for PROD, so try endorsing it
				var prod2_re = /\{\{(?:Proposed deletion endorsed|prod-?2).*?\}\}/;
				if (prod2_re.test(text)) {
					statelem.warn('ఈ పేజీలో ఈసరికే {{prod}}, {{prod-2}} మూసలున్నాయి. ఈ పనిని ఆపేస్తున్నాం');
					return;
				}
				var confirmtext = "ఈ పేజీలో ఈసరికే {{prod}} మూస ఉంది.\n దీనిలో {{prod-2}} (PROD కు మద్దతుగా) మూసను, మీ వివరణతో సహా పెడతారా?";
				if (params.blp) {
					confirmtext = "ఈ పేజీలో ఈసరికే BLP-కాని {{prod}} మూస ఉంది.\n దీనిలో {{prod-2}} (PROD కు మద్దతుగా) మూసను, \"మూలాల్లేని BLP\" అనే వివరణతో సహా పెడతారా?";
				}
				if (!confirm(confirmtext)) {
					statelem.warn('వాడుకరి అభ్యర్థన మేరకు ఆపేసాం');
					return;
				}

				summaryText = "Endorsing proposed deletion per [[WP:" + (params.blp ? "BLP" : "") + "PROD]].";
				text = text.replace(prod_re, text.match(prod_re) + "\n{{prod-2|1=" + (params.blp ? "article is a [[WP:BLPPROD|biography of a living person with no sources]]" : params.reason) + "}}\n");

				if (Twinkle.getPref('logProdPages')) {
					params.logEndorsing = true;
					Twinkle.prod.callbacks.addToLog(params);
				}
			}

			pageobj.setPageText(text);
			pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
			pageobj.setWatchlist(Twinkle.getPref('watchProdPages'));
			pageobj.setCreateOption('nocreate');
			pageobj.save();
		},

		userNotification: function(pageobj) {
			var params = pageobj.getCallbackParameters();
			var initialContrib = pageobj.getCreator();
			var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "తొలి రచయితకు తెలియపరుస్తున్నాం (" + initialContrib + ")");
			var notifytext = "\n{{subst:prodwarning" + (params.blp ? "BLP" : "") + "|1=" + mw.config.get('wgPageName') + "|concern=" + params.reason + "}} ~~~~";
			usertalkpage.setAppendText(notifytext);
			usertalkpage.setEditSummary("గమనింపు: [[" + mw.config.get('wgPageName') + "]] తొలగింపును ప్రతిపాదించారు." + Twinkle.getPref('summaryAd'));
			usertalkpage.setCreateOption('recreate');
			usertalkpage.setFollowRedirect(true);
			usertalkpage.append();
			if (Twinkle.getPref('logProdPages')) {
				params.logInitialContrib = initialContrib;
				Twinkle.prod.callbacks.addToLog(params);
			}
		},

		addToLog: function(params) {
			var wikipedia_page = new Morebits.wiki.page("User:" + mw.config.get('wgUserName') + "/" + Twinkle.getPref('prodLogPageName'), "Adding entry to userspace log");
			wikipedia_page.setCallbackParameters(params);
			wikipedia_page.load(Twinkle.prod.callbacks.saveLog);
		},

		saveLog: function(pageobj) {
			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();

			// add blurb if log page doesn't exist
			if (!pageobj.exists()) {
				text =
					"This is a log of all [[WP:PROD|proposed deletion]] tags applied or endorsed by this user using [[WP:TW|Twinkle]]'s PROD module.\n\n" +
					"If you no longer wish to keep this log, you can turn it off using the [[వికీపీడియా:Twinkle/Preferences|preferences panel]], and " +
					"nominate this page for speedy deletion under [[WP:CSD#U1|CSD U1]].\n";
			}

			// create monthly header
			var date = new Date();
			var headerRe = new RegExp("^==+\\s*" + date.getUTCMonthName() + "\\s+" + date.getUTCFullYear() + "\\s*==+", "m");
			if (!headerRe.exec(text)) {
				text += "\n\n=== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ===";
			}

			var summarytext;
			if (params.logEndorsing) {
				text += "\n# [[" + mw.config.get('wgPageName') + "]]: endorsed " + (params.blp ? "BLP " : "") + "PROD. ~~~~~";
				if (params.reason) {
					text += "\n#* '''కారణం''': " + params.reason + "\n";
				}
				summarytext = "[[" + mw.config.get('wgPageName') + "]] పేజీ PROD నామినేషనుకు మద్దతు పలుకుతూ.";
			} else {
				text += "\n# [[" + mw.config.get('wgPageName') + "]]: " + (params.blp ? "BLP " : "") + "PROD";
				if (params.logInitialContrib) {
					text += "; notified {{user|" + params.logInitialContrib + "}}";
				}
				text += " ~~~~~\n";
				if (!params.blp) {
					text += "#* '''కారణం''': " + params.reason + "\n";
				}
				summarytext = "[[" + mw.config.get('wgPageName') + "]] పేజీ PROD నామినేషను.";
			}

			pageobj.setPageText(text);
			pageobj.setEditSummary(summarytext + Twinkle.getPref('summaryAd'));
			pageobj.setCreateOption("recreate");
			pageobj.save();
		}
	};

	Twinkle.prod.callback.evaluate = function twinkleprodCallbackEvaluate(e) {
		mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' ')); // for queen/king/whatever and country!
		var form = e.target;
		var prodtype;

		var prodtypes = form.prodtype;
		for (var i = 0; i < prodtypes.length; i++) {
			if (!prodtypes[i].checked) {
				continue;
			}
			prodtype = prodtypes[i].values;
			break;
		}

		var params = {
			usertalk: form.notify.checked,
			blp: prodtype === 'prodblp',
			reason: prodtype === 'prodblp' ? '' : form.reason.value // using an empty string here as fallback will help with prod-2.
		};

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(form);

		if (prodtype === 'prodblp' && mw.config.get('wgArticleId') < 26596183) {
			if (!confirm("It appears that this article was created before March 18, 2010, and is thus ineligible for a BLP PROD. Do you want to continue tagging it?")) {
				Morebits.status.warn('Notice', 'Aborting per user input.');
				return;
			}
		}

		Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
		Morebits.wiki.actionCompleted.notice = "ట్యాగులు పెట్టడం పూర్తయింది";

		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "Tagging page");
		wikipedia_page.setFollowRedirect(true); // for NPP, and also because redirects are ineligible for PROD
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.load(Twinkle.prod.callbacks.main);
	};

	/*
	 ****************************************
	 *** twinkleprotect.js: Protect/RPP module
	 ****************************************
	 * Mode of invocation:     Tab ("PP"/"RPP")
	 * Active on:              Non-special pages
	 * Config directives in:   TwinkleConfig
	 */

	// Note: a lot of code in this module is re-used/called by batchprotect.

	Twinkle.protect = function twinkleprotect() {
		if (mw.config.get('wgNamespaceNumber') < 0) {
			return;
		}

		twAddPortletLink(Twinkle.protect.callback, Morebits.userIsInGroup('sysop') ? "PP" : "RPP", "tw-rpp",
			Morebits.userIsInGroup('sysop') ? "Protect page" : "Request page protection");
	};

	Twinkle.protect.callback = function twinkleprotectCallback() {
		if (!twinkleUserAuthorized) {
			alert("మీ ఖాతా మరీ కొత్తది, ట్వింకిల్ వాడలేరు.");
			return;
		}
		var Window = new Morebits.simpleWindow(620, 530);
		Window.setTitle(Morebits.userIsInGroup('sysop') ? "పేజీ సంరక్షణను చెయ్యడం, అభ్యర్థించడం, ట్యాగు పెట్టడం" : "పేజీ సంరక్షణ కొరకు అభ్యర్థించడం, ట్యాగు పెట్టడం");
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("సంరక్షణ మూసలు", "Template:Protection templates");
		Window.addFooterLink("సంరక్షణ విధానం", "WP:PROT");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#protect");

		var form = new Morebits.quickForm(Twinkle.protect.callback.evaluate);
		var actionfield = form.append({
			type: 'field',
			label: 'చర్య రకం'
		});
		if (Morebits.userIsInGroup('sysop')) {
			actionfield.append({
				type: 'radio',
				name: 'actiontype',
				event: Twinkle.protect.callback.changeAction,
				list: [{
					label: 'పేజీ సంరక్షణ',
					value: 'protect',
					tooltip: 'పేజీని సంరక్షించే పని చెయ్యడం.',
					checked: true
				}]
			});
		}
		actionfield.append({
			type: 'radio',
			name: 'actiontype',
			event: Twinkle.protect.callback.changeAction,
			list: [{
				label: 'పేజీని సంరక్షించమని అభ్యర్థన',
				value: 'request',
				tooltip: 'సంరక్షణ స్వయంగా మీరే చెయ్యకుండా, వికీపీడియా:పేజీ సంరక్షణ కొరకు అభ్యర్థనలు' + (Morebits.userIsInGroup('sysop') ? ' ద్వారా సంరక్షణ అభ్యర్థన పంపాలంటే .' : '.'),
				checked: !Morebits.userIsInGroup('sysop')
			}, {
				label: 'పేజీలో సంరక్షణ మూస చేర్పు',
				value: 'tag',
				tooltip: 'సంరక్షించిన నిర్వాహకులు సంరక్షణ మూసను పెట్టడం మర్చిపోయి ఉంటే, లేదా ట్యాగు ఏమీ లేకుండానే మీరు ఇప్పుడే ఈ పేజీని సంరక్షించి ఉంటే, దీన్ని వాడి సముచితమైన సంరక్షణ ట్యాగును పెట్టవచ్చు.',
				disabled: mw.config.get('wgArticleId') === 0
			}]
		});

		form.append({
			type: 'field',
			label: 'ప్రీసెట్',
			name: 'field_preset'
		});
		form.append({
			type: 'field',
			label: '1',
			name: 'field1'
		});
		form.append({
			type: 'field',
			label: '2',
			name: 'field2'
		});

		form.append({
			type: 'submit'
		});

		var result = form.render();
		Window.setContent(result);
		Window.display();

		// We must init the controls
		var evt = document.createEvent("Event");
		evt.initEvent('change', true, true);
		result.actiontype[0].dispatchEvent(evt);

		// get current protection level asynchronously
		Morebits.wiki.actionCompleted.postfix = false; // avoid Action: completed notice
		if (Morebits.userIsInGroup('sysop')) {
			var query = {
				action: 'query',
				prop: 'info|flagged',
				inprop: 'protection',
				titles: mw.config.get('wgPageName')
			};
			Morebits.status.init($('div[name="currentprot"] span').last()[0]);
			var statelem = new Morebits.status("ప్రస్తుత సంరక్షణ స్థాయి");
			var wpapi = new Morebits.wiki.api("తెస్తున్నాం...", query, Twinkle.protect.callback.protectionLevel, statelem);
			wpapi.post();
		}
	};

	Twinkle.protect.protectionLevel = null;

	Twinkle.protect.callback.protectionLevel = function twinkleprotectCallbackProtectionLevel(apiobj) {
		var xml = apiobj.getXML();
		var result = [];

		$(xml).find('pr').each(function(index, pr) {
			var $pr = $(pr);
			var boldnode = document.createElement('b');
			boldnode.textContent = Morebits.string.toUpperCaseFirstChar($pr.attr('type')) + ": " + $pr.attr('level');
			result.push(boldnode);
			if ($pr.attr('expiry') === 'infinity') {
				result.push(" (indefinite) ");
			} else {
				result.push(" (expires " + new Date($pr.attr('expiry')).toUTCString() + ") ");
			}
			if ($pr.attr('cascade') === '') {
				result.push("(cascading) ");
			}
		});

		var $flagged = $(xml).find('flagged');
		if ($flagged.length) {
			var boldnode = document.createElement('b');
			// impossible for now to determine the PC level/expiry using API; bug 24068
			boldnode.textContent = "పెండింగు మార్పులు: సచేతనం";
			result.push(boldnode);
		}

		if (!result.length) {
			var boldnode = document.createElement('b');
			boldnode.textContent = "సంరక్షణేమీ లేదు";
			result.push(boldnode);
		}
		Twinkle.protect.protectionLevel = result;
		apiobj.statelem.info(result);
		window.setTimeout(function() {
			Morebits.wiki.actionCompleted.postfix = "పూర్తయింది";
		}, 500); // restore actionCompleted message
	};

	Twinkle.protect.callback.changeAction = function twinkleprotectCallbackChangeAction(e) {
		var field_preset;
		var field1;
		var field2;

		switch (e.target.values) {
			case 'protect':
				field_preset = new Morebits.quickForm.element({
					type: 'field',
					label: 'ప్రీసెట్',
					name: 'field_preset'
				});
				field_preset.append({
					type: 'select',
					name: 'category',
					label: 'ప్రీసెట్‌ను ఎంచుకోండి:',
					event: Twinkle.protect.callback.changePreset,
					list: (mw.config.get('wgArticleId') ? Twinkle.protect.protectionTypesAdmin : Twinkle.protect.protectionTypesCreate)
				});

				field2 = new Morebits.quickForm.element({
					type: 'field',
					label: 'సంరక్షణ వికల్పాలు',
					name: 'field2'
				});
				field2.append({
					type: 'div',
					name: 'currentprot',
					label: ' '
				}); // holds the current protection level, as filled out by the async callback
				// for existing pages
				if (mw.config.get('wgArticleId')) {
					field2.append({
						type: 'checkbox',
						name: 'editmodify',
						event: Twinkle.protect.formevents.editmodify,
						list: [{
							label: 'దిద్దుబాటు సంరక్షణను సవరించు',
							value: 'editmodify',
							tooltip: 'If this is turned off, the edit protection level, and expiry time, will be left as is.',
							checked: true
						}]
					});
					var editlevel = field2.append({
						type: 'select',
						name: 'editlevel',
						label: 'దిద్దుబాటు సంరక్షణ:',
						event: Twinkle.protect.formevents.editlevel
					});
					editlevel.append({
						type: 'option',
						label: 'అందరూ',
						value: 'all'
					});
					editlevel.append({
						type: 'option',
						label: 'ఆటోకన్ఫర్మ్‌డ్',
						value: 'autoconfirmed'
					});
					editlevel.append({
						type: 'option',
						label: 'నిర్వాహకులు',
						value: 'sysop',
						selected: true
					});
					field2.append({
						type: 'select',
						name: 'editexpiry',
						label: 'ముగింపు:',
						event: function(e) {
							if (e.target.value === 'custom') {
								Twinkle.protect.doCustomExpiry(e.target);
							}
						},
						list: [{
							label: '1 గంట',
							value: '1 hour'
						}, {
							label: '2 గంటలు',
							value: '2 hours'
						}, {
							label: '3 గంటలు',
							value: '3 hours'
						}, {
							label: '6 గంటలు',
							value: '6 hours'
						}, {
							label: '12 గంటలు',
							value: '12 hours'
						}, {
							label: '1 రోజు',
							value: '1 day'
						}, {
							label: '2 రోజులు',
							selected: true,
							value: '2 days'
						}, {
							label: '3 రోజులు',
							value: '3 days'
						}, {
							label: '4 రోజులు',
							value: '4 days'
						}, {
							label: '1 వారం',
							value: '1 week'
						}, {
							label: '2 వారాలు',
							value: '2 weeks'
						}, {
							label: '1 నెల',
							value: '1 month'
						}, {
							label: '2 నెలలు',
							value: '2 months'
						}, {
							label: '3 నెలలు',
							value: '3 months'
						}, {
							label: '1 సంవత్సరం',
							value: '1 year'
						}, {
							label: 'అనిశ్చిత కాలం',
							value: 'indefinite'
						}, {
							label: 'కస్టమ్...',
							value: 'custom'
						}]
					});
					field2.append({
						type: 'checkbox',
						name: 'movemodify',
						event: Twinkle.protect.formevents.movemodify,
						list: [{
							label: 'తరలింపు సంరక్షణను సవరించు',
							value: 'movemodify',
							tooltip: 'దీన్ని ఆఫ్ చేస్తే, తరలింపు సంరక్షణ స్థాయి, ముగింపు సమయాలు అలాగే ఉంటాయి.',
							checked: true
						}]
					});
					var movelevel = field2.append({
						type: 'select',
						name: 'movelevel',
						label: 'తరలింపు సంరక్షణ:',
						event: Twinkle.protect.formevents.movelevel
					});
					movelevel.append({
						type: 'option',
						label: 'అందరూ',
						value: 'all'
					});
					movelevel.append({
						type: 'option',
						label: 'ఆటోకన్ఫర్మ్‌డ్',
						value: 'autoconfirmed'
					});
					movelevel.append({
						type: 'option',
						label: 'నిర్వాహకులు',
						value: 'sysop',
						selected: true
					});
					field2.append({
						type: 'select',
						name: 'moveexpiry',
						label: 'ముగింపు:',
						event: function(e) {
							if (e.target.value === 'custom') {
								Twinkle.protect.doCustomExpiry(e.target);
							}
						},
						list: [{
							label: '1 గంట',
							value: '1 hour'
						}, {
							label: '2 గంటలు',
							value: '2 hours'
						}, {
							label: '3 గంటలు',
							value: '3 hours'
						}, {
							label: '6 గంటలు',
							value: '6 hours'
						}, {
							label: '12 గంటలు',
							value: '12 hours'
						}, {
							label: '1 రోజు',
							value: '1 day'
						}, {
							label: '2 రోజులు',
							selected: true,
							value: '2 days'
						}, {
							label: '3 రోజులు',
							value: '3 days'
						}, {
							label: '4 రోజులు',
							value: '4 days'
						}, {
							label: '1 వారం',
							value: '1 week'
						}, {
							label: '2 వారాలు',
							value: '2 weeks'
						}, {
							label: '1 నెల',
							value: '1 month'
						}, {
							label: '2 నెలలు',
							value: '2 months'
						}, {
							label: '3 నెలలు',
							value: '3 months'
						}, {
							label: '1 సంవత్సరం',
							value: '1 year'
						}, {
							label: 'అనిశ్చిత కాలం',
							value: 'indefinite'
						}, {
							label: 'కస్టమ్...',
							value: 'custom'
						}]
					});
				} else { // for non-existing pages
					var createlevel = field2.append({
						type: 'select',
						name: 'createlevel',
						label: 'సృష్టి సంరక్షణ:',
						event: Twinkle.protect.formevents.createlevel
					});
					createlevel.append({
						type: 'option',
						label: 'అందరూ',
						value: 'all'
					});
					createlevel.append({
						type: 'option',
						label: 'ఆటోకన్ఫర్మ్‌డ్',
						value: 'autoconfirmed'
					});
					createlevel.append({
						type: 'option',
						label: 'నిర్వాహకులు',
						value: 'sysop',
						selected: true
					});
					field2.append({
						type: 'select',
						name: 'createexpiry',
						label: 'ముగింపు:',
						event: function(e) {
							if (e.target.value === 'custom') {
								Twinkle.protect.doCustomExpiry(e.target);
							}
						},
						list: [{
							label: '1 గంట',
							value: '1 hour'
						}, {
							label: '2 గంటలు',
							value: '2 hours'
						}, {
							label: '3 గంటలు',
							value: '3 hours'
						}, {
							label: '6 గంటలు',
							value: '6 hours'
						}, {
							label: '12 గంటలు',
							value: '12 hours'
						}, {
							label: '1 రోజు',
							value: '1 day'
						}, {
							label: '2 రోజులు',
							value: '2 days'
						}, {
							label: '3 రోజులు',
							value: '3 days'
						}, {
							label: '4 రోజులు',
							value: '4 days'
						}, {
							label: '1 వారం',
							value: '1 week'
						}, {
							label: '2 వారాలు',
							value: '2 weeks'
						}, {
							label: '1 నెల',
							value: '1 month'
						}, {
							label: '2 నెలలు',
							value: '2 months'
						}, {
							label: '3 నెలలు',
							value: '3 months'
						}, {
							label: '1 సంవత్సరం',
							value: '1 year'
						}, {
							label: 'అనిశ్చిత కాలం',
							selected: true,
							value: 'indefinite'
						}, {
							label: 'కస్టమ్...',
							value: 'custom'
						}]
					});
				}
				field2.append({
					type: 'textarea',
					name: 'protectReason',
					label: 'సంరక్షణ కారణం (చిట్టా కోసం):'
				});
				if (!mw.config.get('wgArticleId')) { // tagging isn't relevant for non-existing pages
					break;
				}
				/* falls through */
			case 'tag':
				field1 = new Morebits.quickForm.element({
					type: 'field',
					label: 'ట్యాగు వికల్పాలు',
					name: 'field1'
				});
				field1.append({
					type: 'select',
					name: 'tagtype',
					label: 'సంరక్షణ మూసను ఎంచుకోండి:',
					list: Twinkle.protect.protectionTags,
					event: Twinkle.protect.formevents.tagtype
				});
				field1.append({
					type: 'checkbox',
					list: [{
						name: 'small',
						label: 'ఐకను పెట్టు (small=yes)',
						tooltip: 'మూస లోని |small=yes అనే అంశాన్ని వాడి ఒక తాళం కప్ప బొమ్మను పేజీలో పైభాగాన చేరుస్తుంది',
						checked: true
					}, {
						name: 'noinclude',
						label: '<noinclude> తో సంరక్షణ మూసను కప్పేసి పెట్టు ',
						tooltip: 'సంరక్షణ మూసను &lt;noinclude&gt; తో కప్పేసి ఉంచుతుంది. దాంతో అది ట్రాన్స్‌క్లూడు కాదు',
						checked: (mw.config.get('wgNamespaceNumber') === 10)
					}]
				});
				break;

			case 'request':
				field_preset = new Morebits.quickForm.element({
					type: 'field',
					label: 'సంరక్షణ రకం',
					name: 'field_preset'
				});
				field_preset.append({
					type: 'select',
					name: 'category',
					label: 'రకం, కారణం:',
					event: Twinkle.protect.callback.changePreset,
					list: (mw.config.get('wgArticleId') ? Twinkle.protect.protectionTypes : Twinkle.protect.protectionTypesCreate)
				});

				field1 = new Morebits.quickForm.element({
					type: 'field',
					label: 'వికల్పాలు',
					name: 'field1'
				});
				field1.append({
					type: 'select',
					name: 'expiry',
					label: 'వ్యవధి: ',
					list: [{
						label: 'తాత్కాలికం',
						value: 'temporary'
					}, {
						label: 'అనిశ్చిత కాలం',
						value: 'indefinite'
					}, {
						label: '',
						selected: true,
						value: ''
					}]
				});
				field1.append({
					type: 'textarea',
					name: 'reason',
					label: 'కారణం: '
				});
				break;
			default:
				alert("Something's afoot in twinkleprotect");
				break;
		}

		var oldfield;
		if (field_preset) {
			oldfield = $(e.target.form).find('fieldset[name="field_preset"]')[0];
			oldfield.parentNode.replaceChild(field_preset.render(), oldfield);
		} else {
			$(e.target.form).find('fieldset[name="field_preset"]').css('display', 'none');
		}
		if (field1) {
			oldfield = $(e.target.form).find('fieldset[name="field1"]')[0];
			oldfield.parentNode.replaceChild(field1.render(), oldfield);
		} else {
			$(e.target.form).find('fieldset[name="field1"]').css('display', 'none');
		}
		if (field2) {
			oldfield = $(e.target.form).find('fieldset[name="field2"]')[0];
			oldfield.parentNode.replaceChild(field2.render(), oldfield);
		} else {
			$(e.target.form).find('fieldset[name="field2"]').css('display', 'none');
		}

		if (e.target.values === 'protect') {
			// fake a change event on the preset dropdown
			var evt = document.createEvent("Event");
			evt.initEvent('change', true, true);
			e.target.form.category.dispatchEvent(evt);

			// re-add protection level text, if it's available
			if (Twinkle.protect.protectionLevel) {
				Morebits.status.init($('div[name="currentprot"] span').last()[0]);
				Morebits.status.info("ప్రస్తుత సంరక్షణ స్థాయి", Twinkle.protect.protectionLevel);
			}

			// reduce vertical height of dialog
			$(e.target.form).find('fieldset[name="field2"] select').parent().css({
				display: 'inline-block',
				marginRight: '0.5em'
			});
		}
	};

	Twinkle.protect.formevents = {
		editmodify: function twinkleprotectFormEditmodifyEvent(e) {
			e.target.form.editlevel.disabled = !e.target.checked;
			e.target.form.editexpiry.disabled = !e.target.checked || (e.target.form.editlevel.value === 'all');
			e.target.form.editlevel.style.color = e.target.form.editexpiry.style.color = (e.target.checked ? "" : "transparent");
		},
		editlevel: function twinkleprotectFormEditlevelEvent(e) {
			e.target.form.editexpiry.disabled = (e.target.value === 'all');
		},
		movemodify: function twinkleprotectFormMovemodifyEvent(e) {
			e.target.form.movelevel.disabled = !e.target.checked;
			e.target.form.moveexpiry.disabled = !e.target.checked || (e.target.form.movelevel.value === 'all');
			e.target.form.movelevel.style.color = e.target.form.moveexpiry.style.color = (e.target.checked ? "" : "transparent");
		},
		movelevel: function twinkleprotectFormMovelevelEvent(e) {
			e.target.form.moveexpiry.disabled = (e.target.value === 'all');
		},
		createlevel: function twinkleprotectFormCreatelevelEvent(e) {
			e.target.form.createexpiry.disabled = (e.target.value === 'all');
		},
		tagtype: function twinkleprotectFormTagtypeEvent(e) {
			e.target.form.small.disabled = e.target.form.noinclude.disabled = (e.target.value === 'none') || (e.target.value === 'noop');
		}
	};

	Twinkle.protect.doCustomExpiry = function twinkleprotectDoCustomExpiry(target) {
		var custom = prompt('Enter a custom expiry time.  \nYou can use relative times, like "1 minute" or "19 days", or absolute timestamps, "yyyymmddhhmm" (e.g. "200602011405" is Feb 1, 2006, at 14:05 UTC).', '');
		if (custom) {
			var option = document.createElement('option');
			option.setAttribute('value', custom);
			option.textContent = custom;
			target.appendChild(option);
			target.value = custom;
		}
	};

	Twinkle.protect.protectionTypes = [{
		label: 'పూర్తి సంరక్షణ',
		list: [{
			label: 'సాధారణ (పూర్తి)',
			value: 'pp-protected'
		}, {
			label: 'కంటెంటు వివాదం/దిద్దుబాటు యుద్ధం (పూర్తి)',
			value: 'pp-dispute'
		}, {
			label: 'పదేపదే దుశ్చర్య (పూర్తి)',
			value: 'pp-vandalism'
		}, {
			label: 'బాగా వాడే మూస (పూర్తి)',
			value: 'pp-template'
		}, {
			label: 'నిరోధిత వాడుకరి చర్చ పేజీ (పూర్తి)',
			value: 'pp-usertalk'
		}]
	}, {
		label: 'అర్ధ సంరక్షణ',
		list: [{
			label: 'సాధారణ (అర్ధ)',
			value: 'pp-semi-protected'
		}, {
			label: 'పదేపదే దుశ్చర్య (అర్ధ)',
			selected: true,
			value: 'pp-semi-vandalism'
		}, {
			label: 'BLP విధాన ఉల్లంఘనలు  (అర్ధ)',
			value: 'pp-semi-blp'
		}, {
			label: 'సాక్‌పపెట్రీ (అర్ధ)',
			value: 'pp-semi-sock'
		}, {
			label: 'నిరోధిత వాడుకరి చర్చ పేజీ (అర్ధ)',
			value: 'pp-semi-usertalk'
		}]
	}, {
		label: 'పెండింగు మార్పులు',
		list: [{
			label: 'సాధారణ (PC)',
			value: 'pp-pc-protected'
		}, {
			label: 'పదేపదే దుశ్చర్య (PC)',
			value: 'pp-pc-vandalism'
		}, {
			label: 'BLP విధాన ఉల్లంఘనలు (PC)',
			value: 'pp-pc-blp'
		}]
	}, {
		label: 'తరలింపు సంరక్షణ',
		list: [{
			label: 'సాధారణ (తరలింపు)',
			value: 'pp-move'
		}, {
			label: 'వివాదం/తరలింపు యుద్ధం (తరలింపు)',
			value: 'pp-move-dispute'
		}, {
			label: 'పేజీ తరలింపు దుశ్చర్య (తరలింపు)',
			value: 'pp-move-vandalism'
		}, {
			label: 'ఎక్కువగా చూసే పేజీ (తరలింపు)',
			value: 'pp-move-indef'
		}]
	}, {
		label: 'సంరక్షణ తీసివేత',
		value: 'unprotect'
	}];

	// NOTE: this will be merged with the protectionTypes object
	// once PC is implemented for admins
	Twinkle.protect.protectionTypesAdmin = [{
		label: 'పూర్తి సంరక్షణ',
		list: [{
			label: 'సాధారణ (పూర్తి)',
			value: 'pp-protected'
		}, {
			label: 'కంటెంటు వివాదం/దిద్దుబాటు యుద్ధం (పూర్తి)',
			value: 'pp-dispute'
		}, {
			label: 'పదేపదే దుశ్చర్య (పూర్తి)',
			value: 'pp-vandalism'
		}, {
			label: 'బాగా వాడే మూస (పూర్తి)',
			value: 'pp-template'
		}, {
			label: 'నిరోధిత వాడుకరి చర్చ పేజీ (పూర్తి)',
			value: 'pp-usertalk'
		}]
	}, {
		label: 'అర్ధ సంరక్షణ',
		list: [{
			label: 'సాధారణ (అర్ధ)',
			value: 'pp-semi-protected'
		}, {
			label: 'పదేపదే దుశ్చర్య (అర్ధ)',
			selected: true,
			value: 'pp-semi-vandalism'
		}, {
			label: 'BLP విధాన ఉల్లంఘనలు (అర్ధ)',
			value: 'pp-semi-blp'
		}, {
			label: 'సాక్‌పపెట్రీ (అర్ధ)',
			value: 'pp-semi-sock'
		}, {
			label: 'నిరోధిత వాడుకరి చర్చ పేజీ (అర్ధ)',
			value: 'pp-semi-usertalk'
		}]
	}, {
		label: 'తరలింపు సంరక్షణ',
		list: [{
			label: 'సాధారణ (తరలింపు)',
			value: 'pp-move'
		}, {
			label: 'వివాదం/తరలింపు యుద్ధం (తరలింపు)',
			value: 'pp-move-dispute'
		}, {
			label: 'పేజీ తరలింపు దుశ్చర్య (తరలింపు)',
			value: 'pp-move-vandalism'
		}, {
			label: 'ఎక్కువగా చూసే పేజీ (తరలింపు)',
			value: 'pp-move-indef'
		}]
	}, {
		label: 'సంరక్షణ తీసివేత',
		value: 'unprotect'
	}];

	Twinkle.protect.protectionTypesCreate = [{
		label: 'Create protection',
		list: [{
			label: 'సాధారణ ({{pp-create}})',
			value: 'pp-create'
		}, {
			label: 'రోత కలిగించే పేరు',
			value: 'pp-create-offensive'
		}, {
			label: 'పదేపదే సృష్టించడం',
			selected: true,
			value: 'pp-create-salt'
		}, {
			label: 'ఈమధ్యనే తొలగించిన BLP',
			value: 'pp-create-blp'
		}]
	}, {
		label: 'సంరక్షణ తీసివేత',
		value: 'unprotect'
	}];

	// NOTICE: keep this synched with [[MediaWiki:Protect-dropdown]]
	// Also note: stabilize = Pending Changes level
	Twinkle.protect.protectionPresetsInfo = {
		'pp-protected': {
			edit: 'sysop',
			move: 'sysop',
			reason: null
		},
		'pp-dispute': {
			edit: 'sysop',
			move: 'sysop',
			reason: '[[WP:PP#Content disputes|దిద్దుబాటు యుద్ధం / కంటెంటు వివాదం]]'
		},
		'pp-vandalism': {
			edit: 'sysop',
			move: 'sysop',
			reason: 'పదేపదే [[వికీపీడియా:దుశ్చర్య|దుశ్చర్య]]'
		},
		'pp-template': {
			edit: 'sysop',
			move: 'sysop',
			reason: '[[WP:High-risk templates|బాగా వాడే మూస]]'
		},
		'pp-usertalk': {
			edit: 'sysop',
			move: 'sysop',
			reason: '[[WP:PP#Talk-page protection|నిరోధంలో ఉండగా తన వాడుకరి చర్చ పేజీని అనుచితంగా వాడడం]]'
		},
		'pp-semi-vandalism': {
			edit: 'autoconfirmed',
			reason: 'పదేపదే [[వికీపీడియా:దుశ్చర్య|దుశ్చర్య]]',
			template: 'pp-vandalism'
		},
		'pp-semi-blp': {
			edit: 'autoconfirmed',
			reason: '[[WP:Biographies of living persons|జీవించి ఉన్న వ్యక్తుల జీవిత చరిత్ర వ్యాసాల విధానాన్ని]] ఉల్లంఘించడం'
		},
		'pp-semi-usertalk': {
			edit: 'autoconfirmed',
			move: 'sysop',
			reason: '[[WP:PP#Talk-page protection|నిరోధంలో ఉండగా తన వాడుకరి చర్చ పేజీని అనుచితంగా వాడడం]]'
		},
		'pp-semi-template': { // removed for now
			edit: 'autoconfirmed',
			move: 'sysop',
			reason: '[[WP:High-risk templates|బాగా వాడే మూసలు]]',
			template: 'pp-template'
		},
		'pp-semi-sock': {
			edit: 'autoconfirmed',
			reason: 'పదేపదే జరుగుతున్న  [[WP:Sock puppetry|సాక్‌పపెట్రీ]]'
		},
		'pp-semi-protected': {
			edit: 'autoconfirmed',
			reason: null,
			template: 'pp-protected'
		},
		'pp-pc-vandalism': {
			stabilize: 'autoconfirmed', // stabilize = Pending Changes
			reason: 'పదేపదే [[వికీపీడియా:దుశ్చర్య|దుశ్చర్య]]',
			template: 'pp-pc1'
		},
		'pp-pc-blp': {
			stabilize: 'autoconfirmed',
			reason: '[[WP:BLP|జీవించి ఉన్న వ్యక్తుల జీవిత చరిత్ర వ్యాసాల విధానాన్ని]] ఉల్లంఘించడం',
			template: 'pp-pc1'
		},
		'pp-pc-protected': {
			stabilize: 'autoconfirmed',
			reason: null,
			template: 'pp-pc1'
		},
		'pp-move': {
			move: 'sysop',
			reason: null
		},
		'pp-move-dispute': {
			move: 'sysop',
			reason: '[[WP:MOVP|తరలింపు యుద్ధం]]'
		},
		'pp-move-vandalism': {
			move: 'sysop',
			reason: '[[WP:MOVP|పేజీ తరలింపు దుశ్చర్య]]'
		},
		'pp-move-indef': {
			move: 'sysop',
			reason: '[[WP:MOVP|చాలా ఎక్కువగా చూసే పేజీ]]'
		},
		'unprotect': {
			edit: 'all',
			move: 'all',
			stabilize: 'none',
			create: 'all',
			reason: null,
			template: 'none'
		},
		'pp-create-offensive': {
			create: 'sysop',
			reason: '[[WP:SALT|రోత కలిగించే పేరు]]'
		},
		'pp-create-salt': {
			create: 'sysop',
			reason: '[[WP:SALT|పదేపదే సృష్టించడం]]'
		},
		'pp-create-blp': {
			create: 'sysop',
			reason: '[[WP:BLPDEL|ఈమధ్యనే తొలగించిన BLP]]'
		},
		'pp-create': {
			create: 'sysop',
			reason: '{{pp-create}}'
		}
	};

	Twinkle.protect.protectionTags = [{
		label: 'ఏదీ వద్దు (ప్రస్తుతం ఉన్న సంరక్షణ మూసలను తీసెయ్యి)',
		value: 'none'
	}, {
		label: 'ఏదీ వద్దు (ప్రస్తుతం ఉన్న సంరక్షణ మూసలను తీసెయ్యవద్దు)',
		value: 'noop'
	}, {
		label: 'పూర్తి సంరక్షణ మూసలు',
		list: [{
			label: '{{pp-dispute}}: వివాదం/దిద్దుబాటు యుద్ధం',
			value: 'pp-dispute',
			selected: true
		}, {
			label: '{{pp-usertalk}}: నిరోధిత వాడుకరి చర్చ',
			value: 'pp-usertalk'
		}]
	}, {
		label: 'పూర్తి/అర్ధ సంరక్షణ మూసలు',
		list: [{
			label: '{{pp-vandalism}}: దుశ్చర్య',
			value: 'pp-vandalism'
		}, {
			label: '{{pp-template}}: బాగా వాడే మూస',
			value: 'pp-template'
		}, {
			label: '{{pp-protected}}: సాధారణ సంరక్షణ',
			value: 'pp-protected'
		}]
	}, {
		label: 'అర్ధ సంరక్షణ మూసలు',
		list: [{
			label: '{{pp-semi-usertalk}}: నిరోధిత వాడుకరి చర్చ',
			value: 'pp-semi-usertalk'
		}, {
			label: '{{pp-semi-sock}}: సాక్‌పపెట్రీ',
			value: 'pp-semi-sock'
		}, {
			label: '{{pp-semi-blp}}: BLP ఉల్లంఘనలు',
			value: 'pp-semi-blp'
		}, {
			label: '{{pp-semi-indef}}: సాధారణ దీర్ఘ-కాలిక',
			value: 'pp-semi-indef'
		}]
	}, {
		label: 'పెండింగు మార్పుల మూసలు',
		list: [{
			label: '{{pp-pc1}}: పెండింగు మార్పులు స్థాయి 1',
			value: 'pp-pc1'
		}]
	}, {
		label: 'తరలింపు సంరక్షణ మూసలు',
		list: [{
			label: '{{pp-move-dispute}}: వివాదం/తరలింపు యుద్ధం',
			value: 'pp-move-dispute'
		}, {
			label: '{{pp-move-vandalism}}: పేజీ తరలింపు దుశ్చర్య',
			value: 'pp-move-vandalism'
		}, {
			label: '{{pp-move-indef}}: సాధారణ దీర్ఘ-కాలిక',
			value: 'pp-move-indef'
		}, {
			label: '{{pp-move}}: ఇతరాలు',
			value: 'pp-move'
		}]
	}];

	Twinkle.protect.callback.changePreset = function twinkleprotectCallbackChangePreset(e) {
		var form = e.target.form;

		var actiontypes = form.actiontype;
		var actiontype;
		for (var i = 0; i < actiontypes.length; i++) {
			if (!actiontypes[i].checked) {
				continue;
			}
			actiontype = actiontypes[i].values;
			break;
		}

		if (actiontype === 'protect') { // actually protecting the page
			var item = Twinkle.protect.protectionPresetsInfo[form.category.value];
			if (mw.config.get('wgArticleId')) {
				if (item.edit) {
					form.editmodify.checked = true;
					Twinkle.protect.formevents.editmodify({
						target: form.editmodify
					});
					form.editlevel.value = item.edit;
					Twinkle.protect.formevents.editlevel({
						target: form.editlevel
					});
				} else {
					form.editmodify.checked = false;
					Twinkle.protect.formevents.editmodify({
						target: form.editmodify
					});
				}

				if (item.move) {
					form.movemodify.checked = true;
					Twinkle.protect.formevents.movemodify({
						target: form.movemodify
					});
					form.movelevel.value = item.move;
					Twinkle.protect.formevents.movelevel({
						target: form.movelevel
					});
				} else {
					form.movemodify.checked = false;
					Twinkle.protect.formevents.movemodify({
						target: form.movemodify
					});
				}
			} else {
				if (item.create) {
					form.createlevel.value = item.create;
					Twinkle.protect.formevents.createlevel({
						target: form.createlevel
					});
				}
			}

			var reasonField = (actiontype === "protect" ? form.protectReason : form.reason);
			if (item.reason) {
				reasonField.value = item.reason;
			} else {
				reasonField.value = '';
			}

			// sort out tagging options
			if (mw.config.get('wgArticleId')) {
				if (form.category.value === 'unprotect') {
					form.tagtype.value = 'none';
				} else {
					form.tagtype.value = (item.template ? item.template : form.category.value);
				}
				Twinkle.protect.formevents.tagtype({
					target: form.tagtype
				});

				if (/template/.test(form.category.value)) {
					form.noinclude.checked = true;
					form.editexpiry.value = form.moveexpiry.value = "indefinite";
				} else {
					form.noinclude.checked = false;
				}
			}

		} else { // RPP request
			if (form.category.value === 'unprotect') {
				form.expiry.value = '';
				form.expiry.disabled = true;
			} else {
				form.expiry.disabled = false;
			}
		}
	};

	Twinkle.protect.callback.evaluate = function twinkleprotectCallbackEvaluate(e) {
		var form = e.target;

		var actiontypes = form.actiontype;
		var actiontype;
		for (var i = 0; i < actiontypes.length; i++) {
			if (!actiontypes[i].checked) {
				continue;
			}
			actiontype = actiontypes[i].values;
			break;
		}

		if (actiontype === 'tag' || (actiontype === 'protect' && mw.config.get('wgArticleId'))) {
			tagparams = {
				tag: form.tagtype.value,
				reason: ((form.tagtype.value === 'pp-protected' || form.tagtype.value === 'pp-semi-protected' || form.tagtype.value === 'pp-move') && form.protectReason) ? form.protectReason.value : null,
				expiry: (actiontype === 'protect') ? (form.editmodify.checked ? form.editexpiry.value : (form.movemodify.checked ?
					form.moveexpiry.value : null)) : null,
				small: form.small.checked,
				noinclude: form.noinclude.checked
			};
		}

		switch (actiontype) {
			case 'protect':
				// protect the page
				var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'), "పేజీని సంరక్షిస్తున్నాం");
				if (mw.config.get('wgArticleId')) {
					if (form.editmodify.checked) {
						thispage.setEditProtection(form.editlevel.value, form.editexpiry.value);
					}
					if (form.movemodify.checked) {
						thispage.setMoveProtection(form.movelevel.value, form.moveexpiry.value);
					}
				} else {
					thispage.setCreateProtection(form.createlevel.value, form.createexpiry.value);
				}
				if (form.protectReason.value) {
					thispage.setEditSummary(form.protectReason.value);
				} else {
					alert("సంరక్షణకు కారణమేంటో చెప్పాలి. అదే సంరక్షణ చిట్టా లోకి ఎక్కుతుంది.");
					return;
				}

				Morebits.simpleWindow.setButtonsEnabled(false);
				Morebits.status.init(form);

				Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
				Morebits.wiki.actionCompleted.notice = "సంరక్షణ పూర్తయింది";

				thispage.protect(function() {
					thispage.getStatusElement().info("అయిపోయింది");
					if (tagparams) {
						Twinkle.protect.callbacks.taggingPageInitial(tagparams);
					}
				});
				break;

			case 'tag':
				// apply a protection template

				Morebits.simpleWindow.setButtonsEnabled(false);
				Morebits.status.init(form);

				Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
				Morebits.wiki.actionCompleted.followRedirect = false;
				Morebits.wiki.actionCompleted.notice = "ట్యాగులు పెట్టడం పూర్తయింది";

				Twinkle.protect.callbacks.taggingPageInitial(tagparams);
				break;

			case 'request':
				// file request at RPP
				var typename, typereason;
				switch (form.category.value) {
					case 'pp-dispute':
					case 'pp-vandalism':
					case 'pp-template':
					case 'pp-usertalk':
					case 'pp-protected':
						typename = 'full protection';
						break;
					case 'pp-semi-vandalism':
					case 'pp-semi-usertalk':
					case 'pp-semi-template': // removed for now
					case 'pp-semi-sock':
					case 'pp-semi-blp':
					case 'pp-semi-protected':
						typename = 'semi-protection';
						break;
					case 'pp-pc-vandalism':
					case 'pp-pc-blp':
					case 'pp-pc-protected':
						typename = 'pending changes';
						break;
					case 'pp-move':
					case 'pp-move-dispute':
					case 'pp-move-indef':
					case 'pp-move-vandalism':
						typename = 'move protection';
						break;
					case 'pp-create':
					case 'pp-create-offensive':
					case 'pp-create-blp':
					case 'pp-create-salt':
						typename = 'create protection';
						break;
					case 'unprotect':
						/* falls through */
					default:
						typename = 'unprotection';
						break;
				}
				switch (form.category.value) {
					case 'pp-dispute':
						typereason = 'Content dispute/edit warring';
						break;
					case 'pp-vandalism':
					case 'pp-semi-vandalism':
					case 'pp-pc-vandalism':
						typereason = 'పదేపదే జరుగుతున్న దుశ్చర్య';
						break;
					case 'pp-template':
					case 'pp-semi-template': // removed for now
						typereason = 'Highly visible template';
						break;
					case 'pp-usertalk':
					case 'pp-semi-usertalk':
						typereason = 'నిరోధంలో ఉండగా వాడుకరి చర్చ పేజీని అనుచితంగా వాడడం';
						break;
					case 'pp-semi-sock':
						typereason = 'పదేపదే సాక్‌పపెట్రీ';
						break;
					case 'pp-semi-blp':
					case 'pp-pc-blp':
						typereason = '[[WP:BLP|BLP]] విధాన ఉల్లంఘనలు';
						break;
					case 'pp-move-dispute':
						typereason = 'Page title dispute/move warring';
						break;
					case 'pp-move-vandalism':
						typereason = 'Page-move vandalism';
						break;
					case 'pp-move-indef':
						typereason = 'Highly visible page';
						break;
					case 'pp-create-offensive':
						typereason = 'Offensive name';
						break;
					case 'pp-create-blp':
						typereason = 'Recently deleted [[WP:BLP|BLP]]';
						break;
					case 'pp-create-salt':
						typereason = 'Repeatedly recreated';
						break;
					default:
						typereason = '';
						break;
				}

				var reason = typereason;
				if (form.reason.value !== '') {
					if (typereason !== '') {
						reason += "\u00A0\u2013 "; // U+00A0 NO-BREAK SPACE; U+2013 EN RULE
					}
					reason += form.reason.value;
				}
				if (reason !== '' && reason.charAt(reason.length - 1) !== '.') {
					reason += '.';
				}

				var rppparams = {
					reason: reason,
					typename: typename,
					category: form.category.value,
					expiry: form.expiry.value
				};

				Morebits.simpleWindow.setButtonsEnabled(false);
				Morebits.status.init(form);

				rppName = 'వికీపీడియా:Requests for page protection';

				// Updating data for the action completed event
				Morebits.wiki.actionCompleted.redirect = rppName;
				Morebits.wiki.actionCompleted.notice = "నామినేషను చెయ్యడం పూర్తయింది, ఇపుడు చర్చ పేజీకి తీసుకెళ్తున్నాం";

				var rppPage = new Morebits.wiki.page(rppName, 'పేజీని సంరక్షణ చెయ్యమని అభ్యర్ధిస్తున్నారు');
				rppPage.setFollowRedirect(true);
				rppPage.setCallbackParameters(rppparams);
				rppPage.load(Twinkle.protect.callbacks.fileRequest);
				break;
			default:
				alert("twinkleprotect: unknown kind of action");
				break;
		}
	};

	Twinkle.protect.callbacks = {
		taggingPageInitial: function(tagparams) {
			if (tagparams.tag === 'noop') {
				Morebits.status.info("సంరక్షణ మూసను పెడుతున్నాం", "చెయ్యాల్సింది ఏమీ లేదు");
				return;
			}

			var protectedPage = new Morebits.wiki.page(mw.config.get('wgPageName'), 'పేజీలో ట్యాగులు పెడుతున్నాం');
			protectedPage.setCallbackParameters(tagparams);
			protectedPage.load(Twinkle.protect.callbacks.taggingPage);
		},
		taggingPage: function(protectedPage) {
			var params = protectedPage.getCallbackParameters();
			var text = protectedPage.getPageText();
			var tag, summary;

			var oldtag_re = /\s*(?:<noinclude>)?\s*\{\{\s*(pp-[^{}]*?|protected|(?:t|v|s|p-|usertalk-v|usertalk-s|sb|move)protected(?:2)?|protected template|privacy protection)\s*?\}\}\s*(?:<\/noinclude>)?\s*/gi;
			var re_result = oldtag_re.exec(text);
			if (re_result) {
				if (confirm("{{" + re_result[1] + "}} was found on the page. \nClick OK to remove it, or click Cancel to leave it there.")) {
					text = text.replace(oldtag_re, '');
				}
			}

			if (params.tag !== 'none') {
				tag = params.tag;
				if (params.reason) {
					tag += '|reason=' + params.reason;
				}
				if (['indefinite', 'infinite', 'never', null].indexOf(params.expiry) === -1) {
					tag += '|expiry={{subst:#time:Y F j|' + (/^\s*\d+\s*$/.exec(params.expiry) ? params.expiry : '+' + params.expiry) + '}}';
				}
				if (params.small) {
					tag += '|small=yes';
				}
			}

			if (params.tag === 'none') {
				summary = 'Removing protection template' + Twinkle.getPref('summaryAd');
			} else {
				if (params.noinclude) {
					text = "<noinclude>{{" + tag + "}}</noinclude>" + text;
				} else {
					text = "{{" + tag + "}}\n" + text;
				}
				summary = "Adding {{" + params.tag + "}}" + Twinkle.getPref('summaryAd');
			}

			protectedPage.setEditSummary(summary);
			protectedPage.setPageText(text);
			protectedPage.setCreateOption('nocreate');
			protectedPage.save();
		},

		fileRequest: function(rppPage) {

			var params = rppPage.getCallbackParameters();
			var text = rppPage.getPageText();
			var statusElement = rppPage.getStatusElement();

			var ns2tag = {
				'0': 'la',
				'1': 'lat',
				'2': 'lu',
				'3': 'lut',
				'4': 'lw',
				'5': 'lwt',
				'6': 'lf',
				'7': 'lft',
				'8': 'lm',
				'9': 'lmt',
				'10': 'lt',
				'11': 'ltt',
				'12': 'lh',
				'13': 'lht',
				'14': 'lc',
				'15': 'lct',
				'100': 'lp',
				'101': 'lpt',
				'108': 'lb',
				'109': 'lbt'
			};

			var rppRe = new RegExp('====\\s*\\{\\{\\s*' + ns2tag[mw.config.get('wgNamespaceNumber')] + '\\s*\\|\\s*' + RegExp.escape(mw.config.get('wgTitle'), true) + '\\s*\\}\\}\\s*====', 'm');
			var tag = rppRe.exec(text);

			var rppLink = document.createElement('a');
			rppLink.setAttribute('href', mw.util.getUrl(rppPage.getPageName()));
			rppLink.appendChild(document.createTextNode(rppPage.getPageName()));

			if (tag) {
				statusElement.error(['There is already a protection request for this page at ', rppLink, ', aborting.']);
				return;
			}

			var newtag = '==== {{' + ns2tag[mw.config.get('wgNamespaceNumber')] + '|' + mw.config.get('wgTitle') + '}} ====' + "\n";
			if ((new RegExp('^' + RegExp.escape(newtag).replace(/\s+/g, '\\s*'), 'm')).test(text)) {
				statusElement.error(['There is already a protection request for this page at ', rppLink, ', aborting.']);
				return;
			}

			var words;
			switch (params.expiry) {
				case 'temporary':
					words = "Temporary ";
					break;
				case 'indefinite':
					words = "Indefinite ";
					break;
				default:
					words = "";
					break;
			}

			words += params.typename;

			newtag += "'''" + Morebits.string.toUpperCaseFirstChar(words) + (params.reason !== '' ? ":''' " + params.reason : ".'''") + " ~~~~";

			var reg;
			if (params.category === 'unprotect') {
				reg = /(\n==\s*Current requests for unprotection\s*==\s*\n\s*\{\{[^\}\}]+\}\}\s*\n)/;
			} else {
				reg = /(\n==\s*Current requests for protection\s*==\s*\n\s*\{\{[^\}\}]+\}\}\s*\n)/;
			}
			var originalTextLength = text.length;
			text = text.replace(reg, "$1" + newtag + "\n");
			if (text.length === originalTextLength) {
				var linknode = document.createElement('a');
				linknode.setAttribute("href", mw.util.getUrl("వికీపీడియా:Twinkle/Fixing RPP"));
				linknode.appendChild(document.createTextNode('RPPని ఎలా పరిష్కరించాలి'));
				statusElement.error(['WP:RPP లో సంబంధిత శీర్షిక ఏదీ కనబడలేదు. ఈ సమస్యను పరిష్కరించేందుకు ', linknode, ' చూడండి.']);
				return;
			}
			statusElement.status('కొత్త అభ్యర్థనను చేరుస్తున్నాం...');
			rppPage.setEditSummary("Requesting " + params.typename + ' of [[' + mw.config.get('wgPageName').replace(/_/g, ' ') + ']].' + Twinkle.getPref('summaryAd'));
			rppPage.setPageText(text);
			rppPage.setCreateOption('recreate');
			rppPage.save();
		}
	};

	/*
	 ****************************************
	 *** twinklespeedy.js: CSD module
	 ****************************************
	 * Mode of invocation:     Tab ("CSD")
	 * Active on:              Non-special, existing pages
	 * Config directives in:   TwinkleConfig
	 *
	 * NOTE FOR DEVELOPERS:
	 *   If adding a new criterion, check out the default values of the CSD preferences
	 *   in twinkle.header.js, and add your new criterion to those if you think it would
	 *   be good. 
	 */

	Twinkle.speedy = function twinklespeedy() {
		// Disable on:
		// * special pages
		// * non-existent pages
		if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) {
			return;
		}

		twAddPortletLink(Twinkle.speedy.callback, "CSD", "tw-csd", Morebits.userIsInGroup('sysop') ? "Delete page according to WP:CSD" : "Request speedy deletion according to WP:CSD");
	};

	// This function is run when the CSD tab/header link is clicked
	Twinkle.speedy.callback = function twinklespeedyCallback() {
		if (!twinkleUserAuthorized) {
			alert("మీ ఖాతా మరీ కొత్తది, ట్వింకిల్ వాడలేరు.");
			return;
		}

		Twinkle.speedy.initDialog(Morebits.userIsInGroup('sysop') ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
	};

	Twinkle.speedy.dialog = null; // used by unlink feature

	// Prepares the speedy deletion dialog and displays it
	Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) {
		var dialog;
		Twinkle.speedy.dialog = new Morebits.simpleWindow(Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight'));
		dialog = Twinkle.speedy.dialog;
		dialog.setTitle("సత్వర తొలగింపు కారణాలను ఎంచుకోండి");
		dialog.setScriptName("ట్వింకిల్");
		dialog.addFooterLink("సత్వర తొలగింపు విధానం", "WP:CSD");
		dialog.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#speedy");

		var form = new Morebits.quickForm(callbackfunc, (Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null));
		if (Morebits.userIsInGroup('sysop')) {
			form.append({
				type: 'checkbox',
				list: [{
					label: 'పేజీలో ట్యాగు పెట్టు అంతే, తొలగించవద్దు',
					value: 'tag_only',
					name: 'tag_only',
					tooltip: 'ప్రస్తుతానికి పేజీని తొలగించకుండా, ట్యాగు పెట్టడంతో సరిపెడదామని అనుకుంటే',
					checked: Twinkle.getPref('deleteSysopDefaultToTag'),
					event: function(event) {
						var cForm = event.target.form;
						var cChecked = event.target.checked;
						// enable/disable talk page checkbox
						if (cForm.talkpage) {
							cForm.talkpage.disabled = cChecked;
							cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete');
						}
						// enable/disable redirects checkbox
						cForm.redirects.disabled = cChecked;
						cForm.redirects.checked = !cChecked;

						// enable/disable notify checkbox
						cForm.notify.disabled = !cChecked;
						cForm.notify.checked = cChecked;
						// enable/disable multiple
						cForm.multiple.disabled = !cChecked;
						cForm.multiple.checked = false;

						Twinkle.speedy.callback.dbMultipleChanged(cForm, false);

						event.stopPropagation();
					}
				}]
			});
			form.append({
				type: 'header',
				label: 'తొలగింపుకు సంబంధించిన ఎంపికలు'
			});
			if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) { // hide option for user pages, to avoid accidentally deleting user talk page
				form.append({
					type: 'checkbox',
					list: [{
						label: 'చర్చ పేజీని కూడా తొలగించు',
						value: 'talkpage',
						name: 'talkpage',
						tooltip: "దీన్ని ఎంచుకుంటే, చర్చ పేజీ కూడా తొలగించబడుతుంది. మీరు F8 (కామన్స్‌కు తరలించడం) ను ఎంచుకుంటే, ఈ ఎంపికను పట్టించుకోం, చర్చ పేజీ *తొలగించబడదు*.",
						checked: Twinkle.getPref('deleteTalkPageOnDelete'),
						disabled: Twinkle.getPref('deleteSysopDefaultToTag'),
						event: function(event) {
							event.stopPropagation();
						}
					}]
				});
			}
			form.append({
				type: 'checkbox',
				list: [{
					label: 'దారిమార్పులన్నిటినీ కూడా తొలగించు',
					value: 'redirects',
					name: 'redirects',
					tooltip: "దీన్ని ఎంచుకుంటే ఇక్కడికి లింకున్న దారిమార్పు పేజీలన్నీ కూడా తొలగించబడతాయి. వేరే పనులు చేసే క్రమంలో భాగంగా చేసే తొలగింపుల (తరలింపు/విలీనం) విషయంలో దీన్ని ఎంచుకోకండి.",
					checked: Twinkle.getPref('deleteRedirectsOnDelete'),
					disabled: Twinkle.getPref('deleteSysopDefaultToTag'),
					event: function(event) {
						event.stopPropagation();
					}
				}]
			});
			form.append({
				type: 'header',
				label: 'ట్యాగుకు సంబంధించిన ఎంపికలు'
			});
		}

		form.append({
			type: 'checkbox',
			list: [{
				label: 'వీలైతే పేజీని సృష్టించినవారికి తెలియజెయ్యి',
				value: 'notify',
				name: 'notify',
				tooltip: "పేజీ సృష్టికర్త చర్చ పేజీలో ఒక గమనింపు మూసను చేరుస్తాం - మీ ట్వింకిల్ అభిరుచుల్లో మీరు ఎంచుకున్న కారణానికి గమనింపులను చేతనం చేసుకుని ఉంటేనే, ఈ పెట్టెలో టిక్కు పెడితేనే " +
					"సృష్టించినవారిని స్వాగతించవచ్చు కూడా.",
				checked: !Morebits.userIsInGroup('sysop') || Twinkle.getPref('deleteSysopDefaultToTag'),
				disabled: Morebits.userIsInGroup('sysop') && !Twinkle.getPref('deleteSysopDefaultToTag'),
				event: function(event) {
					event.stopPropagation();
				}
			}]
		});
		form.append({
			type: 'checkbox',
			list: [{
				label: 'ఒకటి కంటే ఎక్కువ కారణాలతో ట్యాగు పెట్టు',
				value: 'multiple',
				name: 'multiple',
				tooltip: "దీన్ని ఎంచుకుంటే ఈ పేజీకి వర్తించే అనేక ట్యాగులను ఎంచుకునే వీలు కలుగుతుంది. ఉదాహరణకు, వ్యాసాల్లో G11, A7 లు సాధారణంగా కలిసి వర్తిస్తూ ఉంటాయి.",
				disabled: Morebits.userIsInGroup('sysop') && !Twinkle.getPref('deleteSysopDefaultToTag'),
				event: function(event) {
					Twinkle.speedy.callback.dbMultipleChanged(event.target.form, event.target.checked);
					event.stopPropagation();
				}
			}]
		});

		form.append({
			type: 'div',
			name: 'work_area',
			label: 'CSD మాడ్యూలును చేతనం చెయ్యలేకపోయాం. మళ్ళీ ప్రయత్నించండి. లేదా సమస్య గురించి ట్వింకిల్ డెవలపర్లకు చెప్పండి.'
		});

		if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
			form.append({
				type: 'submit'
			});
		}

		var result = form.render();
		dialog.setContent(result);
		dialog.display();

		Twinkle.speedy.callback.dbMultipleChanged(result, false);
	};

	Twinkle.speedy.callback.dbMultipleChanged = function twinklespeedyCallbackDbMultipleChanged(form, checked) {
		var namespace = mw.config.get('wgNamespaceNumber');
		var value = checked;

		var work_area = new Morebits.quickForm.element({
			type: 'div',
			name: 'work_area'
		});

		if (checked && Twinkle.getPref('speedySelectionStyle') === 'radioClick') {
			work_area.append({
				type: 'div',
				label: 'క్రైటీరియాను ఎంచుకోవడం పూర్తయ్యాక, నొక్కండి:'
			});
			work_area.append({
				type: 'button',
				name: 'submit-multiple',
				label: 'క్వెరీని పంపించు',
				event: function(event) {
					Twinkle.speedy.callback.evaluateUser(event);
					event.stopPropagation();
				}
			});
		}

		var radioOrCheckbox = (value ? 'checkbox' : 'radio');

		if (namespace % 2 === 1 && namespace !== 3) { // talk pages, but not user talk pages
			work_area.append({
				type: 'header',
				label: 'చర్చ పేజీలు'
			});
			work_area.append({
				type: radioOrCheckbox,
				name: 'csd',
				list: Twinkle.speedy.talkList
			});
		}

		switch (namespace) {
			case 0: // article
			case 1: // talk
				work_area.append({
					type: 'header',
					label: 'వ్యాసాలు'
				});
				work_area.append({
					type: radioOrCheckbox,
					name: 'csd',
					list: Twinkle.speedy.getArticleList(value)
				});
				break;

			case 2: // user
			case 3: // user talk
				work_area.append({
					type: 'header',
					label: 'వాడుకరి పేజీలు'
				});
				work_area.append({
					type: radioOrCheckbox,
					name: 'csd',
					list: Twinkle.speedy.getUserList(value)
				});
				break;

			case 6: // file
			case 7: // file talk
				work_area.append({
					type: 'header',
					label: 'దస్త్రాలు'
				});
				work_area.append({
					type: radioOrCheckbox,
					name: 'csd',
					list: Twinkle.speedy.getFileList(value)
				});
				work_area.append({
					type: 'div',
					label: 'CSD F4 (లైసెన్సు లేనివి), F5 (అనాథైన సముచిత వినియోగం), F6 (సముచిత వినియోగ అంవయం లేదు), F11 (అనుమతి లేదు) లను ట్వింకిల్ లోని "DI" ట్యాబు ద్వారా చెయ్యవచ్చు.'
				});
				break;

			case 10: // template
			case 11: // template talk
				work_area.append({
					type: 'header',
					label: 'మూసలు'
				});
				work_area.append({
					type: radioOrCheckbox,
					name: 'csd',
					list: Twinkle.speedy.getTemplateList(value)
				});
				break;

			case 14: // category
			case 15: // category talk
				work_area.append({
					type: 'header',
					label: 'వర్గాలు'
				});
				work_area.append({
					type: radioOrCheckbox,
					name: 'csd',
					list: Twinkle.speedy.categoryList
				});
				break;

			case 100: // portal
			case 101: // portal talk
				work_area.append({
					type: 'header',
					label: 'వేదికలు'
				});
				work_area.append({
					type: radioOrCheckbox,
					name: 'csd',
					list: Twinkle.speedy.getPortalList(value)
				});
				break;

			default:
				break;
		}

		work_area.append({
			type: 'header',
			label: 'సాధారణ కారణాలు'
		});
		work_area.append({
			type: radioOrCheckbox,
			name: 'csd',
			list: Twinkle.speedy.getGeneralList(value)
		});

		work_area.append({
			type: 'header',
			label: 'దారిమార్పులు'
		});
		work_area.append({
			type: radioOrCheckbox,
			name: 'csd',
			list: Twinkle.speedy.redirectList
		});

		var old_area = Morebits.quickForm.getElements(form, "work_area")[0];
		form.replaceChild(work_area.render(), old_area);
	};

	Twinkle.speedy.talkList = [{
		label: 'G8: సంబంధిత సబ్జెక్టు పేజీ లేని చర్చ పేజీలు',
		value: 'talk',
		tooltip: 'ప్రాజెక్టుకు పనికివచ్చే పేజీలు ఈ కోవ లోకి రావు. మరీ ముఖ్యంగా: మరెక్కడా చిట్టా లోకి ఎక్కని తొలగింపు చర్చల పేజీలు, వాడుకరి, వాడుకరి చర్చ పేజీలు, పాత చర్చ పేజీలు, లక్ష్యాన్ని సరైన పేజీకి మార్చగలిగే వీలున్న దారిమార్పులు, కామన్స్‌లో ఉండే దస్త్రం పేజీలు, దస్త్రం చర్చ పేజీలు.'
	}];

	// this is a function to allow for db-multiple filtering
	Twinkle.speedy.getFileList = function twinklespeedyGetFileList(multiple) {
		var result = [];
		result.push({
			label: 'F1: అక్కరలేని దస్త్రం',
			value: 'redundantimage',
			tooltip: 'వికీపీడియాలో ఈసరికే ఉన్న దస్త్రానికి కాపీ - అదే ఫార్మాటులో, అంతే గాని అంతకంటే తక్కువ గానీ రిజల్యూషనుతో. అలాగే, అదే ఫార్మాటులో, అంతే నాణ్యతతో లేదా అంతకంటే తక్కువ నాణ్యతతో ఉన్న ఇతర మీడియా కూడా. లైసెన్సు సమస్యల కారణంగా వికీమీడియా కామన్సులో నకలు చేసిన దస్త్రాలకు ఇది వర్తించదు; వీటికి {{subst:ncd|Image:newname.ext}} లేదా {{subst:ncd}} అనే ట్యాగులు పెట్టాలి'
		});
		result.push({
			label: 'F2: చెడిపోయిన లేదా ఖాళీ దస్త్రం',
			value: 'noimage',
			tooltip: 'Before deleting this type of file, verify that the MediaWiki engine cannot read it by previewing a resized thumbnail of it. This also includes empty (i.e., no content) file description pages for Commons files'
		});
		if (!multiple) {
			result.push({
				label: 'F2: Unneeded file description page for a file on Commons',
				value: 'fpcfail',
				tooltip: 'An image, hosted on Commons, but with tags or information on its English Wikipedia description page that are no longer needed. (For example, a failed featured picture candidate.)'
			});
		}
		result.push({
			label: 'F3: Improper license',
			value: 'noncom',
			tooltip: 'Files licensed as "for non-commercial use only", "non-derivative use" or "used with permission" that were uploaded on or after 2005-05-19, except where they have been shown to comply with the limited standards for the use of non-free content. This includes files licensed under a "Non-commercial Creative Commons License". Such files uploaded before 2005-05-19 may also be speedily deleted if they are not used in any articles'
		});
		if (Morebits.userIsInGroup('sysop')) {
			result.push({
				label: 'F4: లైసెన్సు సమాచారం లేదు',
				value: 'unksource',
				tooltip: 'Files in category "Files with unknown source", "Files with unknown copyright status", or "Files with no copyright tag" that have been tagged with a template that places them in the category for more than seven days, regardless of when uploaded. Note, users sometimes specify their source in the upload summary, so be sure to check the circumstances of the file.'
			});
			result.push({
				label: 'F5: వాడని, ఉచితం కాని, కాపీహక్కులున్న దస్త్రం',
				value: 'unfree',
				tooltip: 'Files that are not under a free license or in the public domain that are not used in any article and that have been tagged with a template that places them in a dated subcategory of Category:Orphaned fairuse files for more than seven days. Reasonable exceptions may be made for file uploaded for an upcoming article. Use the "Orphaned fair use" option in Twinkle\'s DI module to tag files for forthcoming deletion.'
			});
			result.push({
				label: 'F6: సముచిత వినియోగ హేతువు లేదు',
				value: 'norat',
				tooltip: 'సముచిత వినియోగ హేతువు లేని ఏ దస్త్రమైనా ఎక్కించిన వారం లోగా తొలగించబడుతుంది.  సముచిత వినియోగ బాయిలర్‌ప్లేట్ మూసలు సముచిత వినియోగం కిందకి రావు. 2006-05-04 కంటే ముందు ఎక్కించిన దస్త్రాలను వెంటనే తొలగించకూడదు; దాని బదులు, సముచిత వినియోగ హేతువు కావాలని ఎక్కించిన వారికి తెలియ పరచాలి. 2006-05-04 తరువాత ఎక్కించిన దస్త్రాలకు ట్వింకిల్, DI మాడ్యూలు లోని "సముచిత వినియోగ హేతువు లేదు" వికల్పాన్ని వాడవచ్చు..'
			});
		}
		result.push({
			label: 'F7: చెల్లని సముచిత వినియోగ ట్యాగు',
			value: 'badfairuse', // same as below
			tooltip: 'This is only for files with a clearly invalid fair-use tag, such as a {{Non-free logo}} tag on a photograph of a mascot. For cases that require a waiting period (replaceable images or otherwise disputed rationales), use the options on Twinkle\'s DI tab.'
		});
		if (!multiple) {
			result.push({
				label: 'F7: Fair-use media from a commercial image agency which is not the subject of sourced commentary',
				value: 'badfairuse', // same as above
				tooltip: 'Non-free images or media from a commercial source (e.g., Associated Press, Getty), where the file itself is not the subject of sourced commentary, are considered an invalid claim of fair use and fail the strict requirements of WP:NFCC.'
			});
		}
		if (!multiple) {
			result.push({
				label: 'F8: వికీమీడియా కామన్సులో ఈ దస్త్రపు కాపీ, ఇదే రిజల్యూషను లేదా ఎక్కువ రిజల్యూషనులో ఉంది',
				value: 'nowcommons',
				tooltip: 'కింది షరతులు వర్తిస్తేనే: 1: రెండు బొమ్మల ఫైలు ఫార్మాటు ఒకటే అయి ఉండాలి. 2: దస్త్రపు లైసెన్సు, మూలపు స్థాయి సందేహాతీతంగా ఉండాలి, అవి నిస్సందేహంగా కామన్సుకు ఆమోదయోగ్యంగా ఉండాలి. 3: దస్త్రపు వివరణ పేజీ లోని సమాచారమంతా కామన్సు లోని దస్త్రపు వివరణ పేజీలో ఉండాలి -పూర్తి ఎక్కింపు చరితంతో సహా, ఎక్కించినవారి స్థానిక వాడుకరి పేజీలకు లింకులతో సహా. 4: దస్త్రం సంరక్షణలో ఉండకూడదు. దస్త్రపు వివరణ పేజీలో కామన్సుకు తరలించవద్దనే అభ్యర్థన ఉండకూడదు. 5: కామన్సు లోని దస్త్రపు పేరు స్థానిక దస్త్రపు పేరు కంటే భిన్నంగా ఉంటే, ఆ దస్త్రానికి స్థానికంగా ఉన్న ప్రస్తావనలన్నీ కామన్సు లోని దస్త్రపు పేరుకు గురిపెట్టేలా మార్చాలి. 6: {{c-uploaded}} దస్త్రాల కోసం: ప్రధాన పేజీ నుండి తీసెయ్యగానే వాటిని సత్వర తొలగింపు చెయ్యాలి'
			});
		}
		result.push({
			label: 'F9: ఏ సందిగ్ధతా లేని కాపీహక్కుల ఉల్లంఘన',
			value: 'imgcopyvio',
			tooltip: 'The file was copied from a website or other source that does not have a license compatible with Wikipedia, and the uploader neither claims fair use nor makes a credible assertion of permission of free use. Sources that do not have a license compatible with Wikipedia include stock photo libraries such as Getty Images or Corbis. Non-blatant copyright infringements should be discussed at Wikipedia:Files for deletion'
		});
		result.push({
			label: 'F10: ఉపయోగం లేని మీడియా ఫైలు',
			value: 'badfiletype',
			tooltip: 'Files uploaded that are neither image, sound, nor video files (e.g. .doc, .pdf, or .xls files) which are not used in any article and have no foreseeable encyclopedic use'
		});
		if (Morebits.userIsInGroup('sysop')) {
			result.push({
				label: 'F11: అనుమతులున్నట్లు ఋజువు లేదు',
				value: 'nopermission',
				tooltip: 'If an uploader has specified a license and has named a third party as the source/copyright holder without providing evidence that this third party has in fact agreed, the item may be deleted seven days after notification of the uploader'
			});
		}
		result.push({
			label: 'G8: సంబంధిత దస్త్రం లేని దస్త్రపు వివరణ పేజీ',
			value: 'imagepage',
			tooltip: 'This is only for use when the file doesn\'t exist at all. Corrupt files, and local description pages for files on Commons, should use F2; implausible redirects should use R3; and broken Commons redirects should use G6.'
		});
		return result;
	};

	Twinkle.speedy.getArticleList = function twinklespeedyGetArticleList(multiple) {
		var result = [];
		result.push({
			label: 'A1: సందర్భం లేదు. వ్యాస విషయాన్ని పరిచయం చేయడానికి సరిపడేంత స్థాయిలో సందర్భం లేని వ్యాసాలు.',
			value: 'nocontext',
			tooltip: 'ఉదాహరణ: "ఎర్రకారొకటి వేసుకుని తిరుగుతూ ఉండే జోకరు లాంటి వాడతడు. జనాన్ని నవ్విస్తూంటాడు." ఇది చాలా చిన్న వ్యాసాలకే వర్తిస్తుంది. సందర్భం అనేది కంటెంటు కంటే భిన్నమైనది. కంటెంటు గురించి కింద A3 లో ఉంది.'
		});
		result.push({
			label: 'A2: వేరే వికీమీడియా ప్రాజెక్టులో ఉన్న పరభాషా వ్యాసాలు',
			value: 'foreign',
			tooltip: 'ఈ వ్యాసం వేరే భాషా ప్రాజెక్టులో లేనట్లైతే, {{తెలుగు కాదు}} అనే మూసను వాడాలి. ఈ కారణాలకు లోబడని తెలుగేతర వ్యాసాలన్నిటిలో {{అనువాదం}} అనే మూస పెట్టాలి'
		});
		result.push({
			label: 'A3: అసలు కంటెంటే లేదు',
			value: 'nocontent',
			tooltip: 'కొన్ని లింకులు, వర్గాలు, "ఇవి కూడా చూడండి" విభాగం వంటివి మాత్రమే ఉన్న వ్యాసం, వ్యాస శీర్షికనే తిప్పి రాసిన వ్యాసం, వ్యాస శీర్షికకు చెందిన వ్యక్తినో సమూహాన్నో సంబోధించే వ్యాసం. అయోమయ నివృత్తి వ్యాసాలు ఈ కోవ లోకి రావు'
		});
		result.push({
			label: 'A5: ట్రాన్స్‌వికీ చేసిన వ్యాసాలు',
			value: 'transwiki',
			tooltip: 'తొలగింపు కొరకు వ్యాసాలు పేజీల్లో చర్చించి, అక్కడి నిర్ణయం మేరకు సరైన పద్ధతిలో ట్రాన్స్‌వికీ చేసి (వేరే వికీమీడియా ప్రాజెక్టుకు తరలించడం), కర్తృత్వాన్ని నిర్ధారించిన వ్యాసం. అలాగే, నిఘంటు అర్థం మాత్రమే ఉండి, సరైన విధంగా ట్రాన్స్‌వికీ చేసి కర్తృత్వాన్ని నిర్ధారించిన వ్యాసం కూడా.'
		});
		if (multiple) {
			result.push({
				label: 'A7: ప్రాముఖ్యత లేని వ్యక్తులు, సమూహాలు, సంస్థలు, వెబ్ కంటెంటు, జంతువులు',
				value: 'a7',
				tooltip: 'విషయ ప్రాముఖ్యత లేని నిజమైన వ్యక్తి, వ్యక్తుల సమూహం, బ్యాండు, క్లబ్బు, సంస్థ, వెబ్ కంటెంటు, జంతువు గురించిన వ్యాసం. అది వివాదాస్పద విషయమైతే, లేదా గతంలో దానిపై తొలగింపు చర్చ జరుగు అందులో దాన్ని ఉంచాలనే నిర్ణయం తీసుకుని ఉంటే, సదరు వ్యాసాన్ని తొలగింపు కొరకు ప్రతిపాదించాలి'
			});
		} else {
			result.push({
				label: 'A7: ప్రాముఖ్యత లేని వ్యక్తి',
				value: 'person',
				tooltip: 'విషయ ప్రాముఖ్యతను వివరించని, వ్యక్తి గురించిన వ్యాసం. వివాదాస్పదమైన విషయమైతే, లేదా గతంలో తొలగింపు చర్చ జరిగి అందులో ఉంచాలనే నిర్ణయం జరిగి ఉంటే తొలగింపు కొరకు ప్రతిపాదించాలి'
			});
			result.push({
				label: 'A7: ప్రాముఖ్యత లేని సంగీత కారుడు/బృందం',
				value: 'band',
				tooltip: 'విషయ ప్రాముఖ్యతను వివరించని, బ్యాండు లేదా గాయకుడు లేదా సంగీత బృందం గురించిన వ్యాసం'
			});
			result.push({
				label: 'A7: ప్రాముఖ్యత లేని క్లబ్బు',
				value: 'club',
				tooltip: 'విషయ ప్రాముఖ్యతను వివరించని, క్లబ్బు గురించిన వ్యాసం'
			});
			result.push({
				label: 'A7: ప్రాముఖ్యత లేని కంపెనీ లేదా సంస్థ',
				value: 'corp',
				tooltip: 'విషయ ప్రాముఖ్యతను వివరించని, కంపెనీ లేదా సంస్థ గురించిన వ్యాసం'
			});
			result.push({
				label: 'A7: ప్రాముఖ్యత లేని వెబ్ కంటెంటు',
				value: 'web',
				tooltip: 'విషయ ప్రాముఖ్యతను వివరించని, వెబ్‌సైటు, బ్లాగు, చర్చావేదిక, వెబ్‌కామిక్, పాడ్‌కాస్టు, తదితర వెబ్ కంటెంటు గురించిన వ్యాసం'
			});
			result.push({
				label: 'A7: ప్రాముఖ్యత లేని నిర్దుష్ట జంతువు',
				value: 'animal',
				tooltip: 'విషయ ప్రాముఖ్యతను వివరించని, నిర్దుష్ట జంతువు (ఉదాహరణకు ఏదైనా పెంపుడు జంతువు) గురించిన వ్యాసం'
			});
			result.push({
				label: 'A7: ప్రాముఖ్యత లేని ఘటన',
				value: 'event',
				tooltip: 'విషయ ప్రాముఖ్యతను వివరించని, ఘటన (యాత్ర, వేడుక, సమావేశం,పార్టీ వగైరాలు) గురించిన వ్యాసం'
			});
		}
		result.push({
			label: 'A9: ప్రాముఖ్యత లేని సంగీత రికార్డు - దాని సంగీత కారులకు పేజీ లేదు',
			value: 'a9',
			tooltip: 'విషయ ప్రాముఖ్యతను వివరించని, సంగీత రికార్డు గురించిన వ్యాసం. పైగా దాని సంగీత కారులకు వికీ పేజీ లేదు, లేదా వారి పేజీ తొలగించబడింది'
		});
		result.push({
			label: 'A10: ఈసరికే ఉన్న విషయం గురించి ఈమధ్య మళ్ళీ రాసిన నకలు వ్యాసం',
			value: 'a10',
			tooltip: 'ఈమధ్యే సృష్టించిన, పేజీ చరిత్ర లేని నకలు వ్యాసం. ఇదే విషయంపై ఉన్న అసలు వ్యాసాలను మెరుగు పరచేలా ఇందులో సమాచారమేమీ లేదు. దీని శీర్షిక ఆ వ్యాసాలకు దారిమార్పుగా చేసే యోగ్యత కూడా లేదు. వేరే వ్యాసం నుండి సమాచారాన్ని తీసి కొత్త వ్యాసంగా చేసిన వ్యాసాలు, ఈసరికే ఉన్న వ్యాసాలను మెరుగుపరచే కంటెంటు ఉండే వ్యాసాలూ ఈ కోవ లోకి రావు.'
		});
		return result;
	};

	Twinkle.speedy.categoryList = [{
		label: 'C1: ఖాళీ వర్గాలు',
		value: 'catempty',
		tooltip: 'కనీసం నాలుగు రోజులుగా ఖాళీగా ఉన్న వర్గాలు. "వికీపీడియా:చర్చ కొరకు వర్గాలు" వద్ద చర్చలో ఉన్న వర్గాలు, అయోమయ నివృత్తి వర్గాలు, కొన్ని ఇతర మినహాయింపులూ ఈ కోవ లోకి రావు. వర్గం కొత్తది కానట్లైతే, బహుశా గతంలో అందులో పేజీలు ఉండి ఉండవచ్చు. ఇలాంటి కేసులను మరింత పరిశోధించాల్సి ఉంటుంది. '
	}, {
		label: 'G8: తొలగించిన మూస ద్వారా గానీ, లక్ష్యం మారిన మూస ద్వారా గానీ గతంలో పేజీలు చేరిన వర్గం',
		value: 'templatecat',
		tooltip: 'గతంలో మూస(ల) ద్వారా పేజీలు చేరిన వర్గం, ప్రస్తుతం ఆ మూస తొలగింపబడడం వలన ఖాళీ అయిపోయింది. ఇంకా వాడుకలో ఉన్న వర్గాలు దీనికి మినహాయింపు.'
	}];

	Twinkle.speedy.getUserList = function twinklespeedyGetTemplateList(multiple) {
		var result = [];
		result.push({
			label: 'U1: వాడుకరి అభ్యర్థన',
			value: 'userreq',
			tooltip: 'Personal subpages, upon request by their user. In some rare cases there may be administrative need to retain the page. Also, sometimes, main user pages may be deleted as well. See Wikipedia:User page for full instructions and guidelines'
		});
		result.push({
			label: 'U2: ఉనికిలో లేని వాడుకరి',
			value: 'nouser',
			tooltip: 'User pages of users that do not exist (Check Special:Listusers)'
		});
		result.push({
			label: 'U3: ఉచితం కాని గ్యాలరీలు',
			value: 'gallery',
			tooltip: 'Galleries in the userspace which consist mostly of "fair use" or non-free files. Wikipedia\'s non-free content policy forbids users from displaying non-free files, even ones they have uploaded themselves, in userspace. It is acceptable to have free files, GFDL-files, Creative Commons and similar licenses along with public domain material, but not "fair use" files'
		});
		if (!multiple) {
			result.push({
				label: 'G11: ప్రచారోద్దేశపు వాడుకరి సృష్టించిన ప్రచార వాడుకరి పేజీ',
				value: 'spamuser',
				tooltip: 'A promotional user page, with a username that promotes or implies affiliation with the thing being promoted. Note that simply having a page on a company or product in one\'s userspace does not qualify it for deletion. If a user page is spammy but the username is not, then consider tagging with regular G11 instead.'
			});
		}
		return result;
	};

	Twinkle.speedy.getTemplateList = function twinklespeedyGetTemplateList(multiple) {
		var result = [];
		result.push({
			label: 'T2: Templates that are blatant misrepresentations of established policy',
			value: 'policy',
			tooltip: 'This includes "speedy deletion" templates for issues that are not speedy deletion criteria and disclaimer templates intended to be used in articles'
		});
		if (!multiple) {
			result.push({
				label: 'T3: Duplicate templates or hardcoded instances',
				value: 'duplicatetemplate',
				tooltip: 'Templates that are either substantial duplications of another template or hardcoded instances of another template where the same functionality could be provided by that other template'
			});
			result.push({
				label: 'T3: Templates that are not employed in any useful fashion',
				value: 't3',
				tooltip: 'This criterion allows you to provide a rationale. In many cases, another criterion will be more appropriate, such as G1, G2, G6, or G8.'
			});
		}
		return result;
	};

	Twinkle.speedy.getPortalList = function twinklespeedyGetPortalList(multiple) {
		var result = [];
		if (!multiple) {
			result.push({
				label: 'P1: Portal that would be subject to speedy deletion if it were an article',
				value: 'p1',
				tooltip: 'You must specify the article criterion that applies in this case (A1, A3, A7, or A10).'
			});
		}
		result.push({
			label: 'P2: Underpopulated portal',
			value: 'emptyportal',
			tooltip: 'Any Portal based on a topic for which there is not a non-stub header article, and at least three non-stub articles detailing subject matter that would be appropriate to discuss under the title of that Portal'
		});
		return result;
	};

	Twinkle.speedy.getGeneralList = function twinklespeedyGetGeneralList(multiple) {
		var result = [];
		if (!multiple) {
			result.push({
				label: 'Custom rationale' + (Morebits.userIsInGroup('sysop') ? ' (custom deletion reason)' : ' using {' + '{db}} template'),
				value: 'reason',
				tooltip: '{' + '{db}} is short for "delete because". At least one of the other deletion criteria must still apply to the page, and you must make mention of this in your rationale. This is not a "catch-all" for when you can\'t find any criteria that fit.'
			});
		}
		result.push({
			label: 'G1: చెత్త. ఏ భాషా కాని, అర్థం పర్థం లేని చెత్త రాతలు.',
			value: 'nonsense',
			tooltip: 'నాసి రకపు భాష, బూతు రాతలు, దుశ్చర్య, కల్పిత రచనలు, తెలుగేతర భాషలో ఉన్న రాతలు, తప్పుడు అనువాదాలు, కొత్తకొత్త సిద్ధాంతాలు, హోక్స్‌లు వగైరాలు ఈ కోవ లోకి రావు. క్లుప్తంగా చెప్పాలంటే, మీకు అర్థమౌతోంటే అది G1 కానట్లే.'
		});
		result.push({
			label: 'G2: పరీక్షా పేజీ',
			value: 'test',
			tooltip: 'దిద్దుబాటు చెయ్యడం వంటి పనులను పరీక్షించేందుకు సృష్టించిన పేజీ. వాడుకరి పేరుబరి లోని పేజీలు, వాడని,నకలు మూసలూ దీనికి మినహాయింపు (మూసలకు T3 వర్తిస్తుంది).'
		});
		result.push({
			label: 'G3: కల్తీ లేని దుశ్చర్య',
			value: 'vandalism',
			tooltip: 'తేటతెల్లంగా ఉన్న, కల్తీ లేని దుశ్చర్య (పేజీ తరలింపు దుశ్చర్య ద్వారా ఏర్పడిన దారిమార్పు పేజీలు కూడా ఇందులో భాగమే)'
		});
		if (!multiple) {
			result.push({
				label: 'G3: విస్పష్టమైన హోక్స్',
				value: 'hoax',
				tooltip: 'దుశ్చర్య అంచుల దాకా చేరిన విస్పష్టమైన హోక్స్'
			});
		}
		result.push({
			label: 'G4: తొలగింపు చర్చల ద్వారా తొలగించిన పేజీని మళ్ళీ సృష్టించడం',
			value: 'repost',
			tooltip: 'తొలగింపు విధానం ద్వారా తొలగించిన పేజీ లోని కంటెంటుతో, ఏదో ఒక పేరుతో తిరిగి సృష్టించిన పేజీ. తొలగించిన పేజీకి ఈ పేజీకీ మధ్య దగ్గరి సారూప్యత ఉండాలి. తొలగింపు చర్చల్లో పేజీని వాడుకరి పేరుబరికి తరలించినవి, తొలగింపు సమీక్షలో తొలగింపును రద్దు చేసినవీ ఈ కోవ లోకి రావు. సత్వర తొలగింపులు కూడ్ ఈ కోవలోకి రావు - అయితే ఈ సందర్భంలో ఇతర సత్వర తొలగింపు కారణాలేమైనా వర్తిస్తే వర్తించవచ్చు'
		});
		result.push({
			label: 'G5: నిషేధిత / నిరోధిత వాడుకరి',
			value: 'banned',
			tooltip: 'నిషేధం గాని, నిరోధం గానీ విధించబడిన వాడుకరులు తమపై ఉన్న నిషేధాన్ని/నిరోధాన్ని ధిక్కరించి సృష్టించిన పేజీలు -ఇతరులు పెద్దగా దిద్దుబాట్లు చెయ్యనివి'
		});
		if (!multiple) {
			result.push({
				label: 'G6: చరిత్ర విలీనం',
				value: 'histmerge',
				tooltip: 'పేజీ చరిత్రలను విలీనం చేసే క్రమంలో చేసే తాత్కాలిక తొలగింపులు'
			});
			result.push({
				label: 'G6: తరలింపు',
				value: 'move',
				tooltip: 'దారిమార్పును వెనక్కితిప్పడం లాంటి వివాదమేమీ లేని పనులు చేసేందుకు'
			});
			result.push({
				label: 'G6: XfD',
				value: 'xfd',
				tooltip: 'తొలగింపు చర్చను నిర్వాహకులు ముగించి "తొలగించాలి" అనే నిర్ణయం ప్రకటించారు గానీ (AfD, FfD, RfD, TfD, CfD, MfD వగైరా చోట్ల) తొలగించే పని చెయ్యలేదు.'
			});
			result.push({
				label: 'G6: అనవసరమైన అయోమయ నివృత్తి పేజీ',
				value: 'disambig',
				tooltip: 'అనాథ లైన అయోమయ నివృత్తి పేజీలకే ఇది వర్తిస్తుంది. అవి: (1) ఒకటి గానీ, రెండు గానీ పేజీలను అయోమయం నుండి తొలగించే అయోమయ నివృత్తి పేజీలు గానీ (ఒక ప్రాథమిక టాపిక్ ఉందన్నమాట); లేదా (2) అసలు పేజీలేమీ లేకుండానే అయోమయాన్ని తొలగించాలని చూసే పేజీలు గానీ అయి ఉండవచ్చు.'
			});
			result.push({
				label: 'G6: సరిగా లేని అయోమయ నివృత్తి పేజీకి దారిమార్పుగా ఉన్న పేజీ',
				value: 'movedab',
				tooltip: 'పేరులో (అయోమయ నివృత్తి) అని ఉన్నప్పటికీ, ప్రాథమికమైన పేజీ అంటూ లేని అయోమయ నివృత్తి పేజీకి దారితీసే దరిమార్పు పేజీలకు మాత్రజే ఇది వర్తిస్తుంది.'
			});
			result.push({
				label: 'G6: కాపీ పేస్టు చేసి, తరలించిన పేజీ',
				value: 'copypaste',
				tooltip: 'కాపీ పేస్టు చేసి తరలించిన పేజీలకే ఇది వర్తిస్తుంది. తరలింపును పద్ధతి ప్రకారం సరిగ్గా చేసేందుకు తాత్కాలికంగా తొలగించవలసి ఉంటుంది.'
			});
		}
		result.push({
			label: 'G6: ఇల్లు సర్దుకోవడం',
			value: 'g6',
			tooltip: 'వివాదాలేమీ లేని ఇతర నిర్వహణ పనులు'
		});
		result.push({
			label: 'G7: రచయితే తొలగించమని అడిగారు, లేదా పేజీని తుడిచేసారు',
			value: 'author',
			tooltip: 'స్వయంగా పేజీ కర్తయే తొలగించమని కోరిన సందర్భంలో - ఆ పేజీలో అత్యధిక కంటెంటును సమర్పించినది ఆ కర్తయే అయినప్పుడు. ఆ కర్త పేజీని తుడిచేసినప్పుడు కూడా, దాన్ని తొలగింపు అభ్యర్ధన గానే భావించవచ్చు.'
		});
		result.push({
			label: 'G8: అసలు ఉనికిలోనే లేని, లేదా తొలగించబడిన పేజీపై ఆధారపడిన పేజీలు',
			value: 'g8',
			tooltip: 'సబ్జెక్టు పేజీ లేని చర్చ పేజీలు; మాతృక లేని ఉప పేజీలు; దస్త్రం లేని దస్త్రం పేజీలు; తప్పు లక్ష్యానికి గురిపెట్టిన, అసలు ఉనికిలోనే లేని పేజీకి గురిపెట్టిన దారిమార్పు పేజీలు, చుట్టు తిరుగుడు దారిమార్పు పేజీలు, తప్పు శీర్షికలతో ఉన్న దారిమార్పు పేజీలు; తొఒలగించిన మూసల ద్వారా, లక్ష్యాన్ని మార్చిన మూసల ద్వారా పేజీలు చేరిన వర్గాలు వంటివి. ప్రాజెక్టుకు పనికివచ్చే పేజీలు ఈ కోవ లోకి రావు. మరీ ముఖ్యంగా: మరెక్కడా చిట్టా లోకి ఎక్కని తొలగింపు చర్చల పేజీలు, వాడుకరి, వాడుకరి చర్చ పేజీలు, పాత చర్చ పేజీలు, లక్ష్యాన్ని సరైన పేజీకి మార్చగలిగే దారిమార్పులు, కామన్స్‌లో ఉండే దస్త్రం పేజీలు, దస్త్రం చర్చ పేజీలు.'
		});
		if (!multiple) {
			result.push({
				label: 'G8: మాతృక లేని ఉప పేజీలు',
				value: 'subpage',
				tooltip: 'ప్రాజెక్టుకు పనికివచ్చే పేజీలు ఈ కోవ లోకి రావు. మరీ ముఖ్యంగా: మరెక్కడా చిట్టా లోకి ఎక్కని తొలగింపు చర్చల పేజీలు, వాడుకరి, వాడుకరి చర్చ పేజీలు, పాత చర్చ పేజీలు, లక్ష్యాన్ని సరైన పేజీకి మార్చగలిగే దారిమార్పులు, కామన్స్‌లో ఉండే దస్త్రం పేజీలు, దస్త్రం చర్చ పేజీలు.'
			});
		}
		result.push({
			label: 'G10: దాడి పేజీ',
			value: 'attack',
			tooltip: 'వ్యాస విషయాన్నో, వేరే ఇతర వస్తువునో చులకన చేసి చూపించే వ్యాసం (ఉదా.. "దారినపోయే దానయ్య తలమాసినవాడు"). జీవించి ఉన్న వ్యక్తికి సంబంధించి, పూర్తిగా నెగటివుగా ఉన్న, మూలాలు చూపించని జీవిత చరిత్ర వ్యాసం - ఏదైనా పాత కూర్పుకు తీసుకువెళ్దామనుకున్నప్పటికీ, తటస్థంగా ఉన్న కూర్పు ఒక్కటి కూడా పేజీ చరిత్రలో లేని వ్యాసం - కూడా ఇందులో భాగమే. ఇలాంటి పేజీలను తొలగించే నిర్వాహకులు పేజీ కంటెంటును తొలగింపు సారాంశంలో ప్రస్తావించకూడదు.!'
		});
		if (!multiple) {
			result.push({
				label: 'G10: పూర్తిగా నెగటివుగా ఉన్న, మూలాల్లేని, జీవించి ఉన్నవారి జీవిత చరిత్ర',
				value: 'negublp',
				tooltip: 'జీవించి ఉన్న వ్యక్తికి సంబంధించి, పూర్తిగా నెగటివుగా ఉన్న, మూలాలు చూపించని జీవిత చరిత్ర వ్యాసం -ఏదైనా పాత కూర్పుకు తీసుకువెళ్దామనుకున్నప్పటికీ, తటస్థంగా ఉన్న కూర్పు ఒక్కటి కూడా పేజీ చరిత్రలో లేని వ్యాసం.'
			});
		}
		result.push({
			label: 'G11: సందిగ్ధమేమీ లేని వ్యాపార ప్రకటనే',
			value: 'spam',
			tooltip: 'ఓ కంపెనీకో, ఉత్పత్తికో, సమూహానికో, సేవకో, వ్యక్తికో ప్రచారం చేసే పేజీలు -విజ్ఞాన సర్వస్వ రూపం లోకి తేవాలంటే, వాటిని మొత్తంగా తిరగరాయాల్సి ఉండే వ్యాసాలివి. వ్యాస విషయం గురించి తటస్థ దృక్కోణంలో రాసే వ్యాసాలు ఈ కోవ లోకి రావు; వ్యాపార ప్రకటన అనే వ్యాసంలో అనుచితమైన కంటెంటు కూడా ఉండాలి'
		});
		result.push({
			label: 'G12: సందిగ్ధమేమీ లేని కాపీహక్కు ఉల్లంఘన',
			value: 'copyvio',
			tooltip: '(1) వికీపీడియాకు అనుగుణమైన లైసెన్సు లేని కంటెంటును ఏదో వెబ్‌సైటు నుండో, లేదా ఫొటోలు అమ్మే సైట్ల (గెట్టీ ఇమేజెస్ లేదా కార్బిస్ వంటివి) లోని ఫొటోలనో, లేదా ఏదైనా వ్యాపారాత్మకంగా కంటెంటును అమ్మే సైటు నుండో కాపీ చేసైనా ఉండాలి; (2) కాపీహక్కుల ఉల్లంఘన లేని కంటెంటంటూ, పేజీ చరిత్రలో చూస్తే, పెద్దగా ఏమీ లేకపోయి ఉండాలి; లేదా (3) వికీలోనే తొలిగా సృష్టించి, ఆ తరువాత వేరే వెబ్‌సైట్లు దాన్ని కాపీ చేయగా, దాన్ని మళ్ళీ వికీలోకి కాపీ చెయ్యడం లాగా కాకుండా, ఎవరో ఒక వ్యక్తి ఒక్కసారే కాపీ చెయ్యడమైనా జరిగి ఉండాలి'
		});
		return result;
	};

	Twinkle.speedy.redirectList = [{
		label: 'R2: ప్రధానబరి నుండి వర్గం:, మూస:, వికీపీడియా:, సహాయం:, వేదిక: పేరుబరులకు కాకుండా వేరే ఏ పేరుబరికైనా చేసే దారిమార్పులు',
		value: 'rediruser',
		tooltip: '(వికీపీడియా షార్ట్‌కట్ మిధ్యా పేరుబరులు ఇందులోకి రావు). పేజీ తరలింపు ఫలితంగా ఇది జరిగి ఉంటే, తొలగించే ముందు ఒకటి రెండు రోజులాగండి'
	}, {
		label: 'R3: పైకి స్పష్టంగా తెలియని టైపో కారణంగా ఇటీవలే సృష్టించిన దారిమార్పు',
		value: 'redirtypo',
		tooltip: 'అయితే, సామాన్యంగా ఉండే తప్పు అక్షర క్రమాలు, పొరపాటు పేర్లు, ఇంగ్లీషు పదం వగైరాల నుండి చేసే దారి మార్పులు ఉపయోగమే. అవి ఈ కోవ లోకి రావు'
	}, {
		label: 'G8: అసలు ఉనికి లోనే లేని పేజీలు, చుట్టు తిరుగుడు, తప్పు పేర్లు.. మొదలైన తప్పు లక్ష్యాలకు చేసే దారిమార్పులు',
		value: 'redirnone',
		tooltip: 'ప్రాజెక్టుకు పనికివచ్చే పేజీలు ఈ కోవ లోకి రావు. మరీ ముఖ్యంగా: మరెక్కడా చిట్టా లోకి ఎక్కని తొలగింపు చర్చల పేజీలు, వాడుకరి, వాడుకరి చర్చ పేజీలు, పాత చర్చ పేజీలు, లక్ష్యాన్ని సరైన పేజీకి మార్చగలిగే వీలున్న దారిమార్పులు, కామన్స్‌లో ఉండే దస్త్రం పేజీలు, దస్త్రం చర్చ పేజీలు.'
	}];

	Twinkle.speedy.normalizeHash = {
		'reason': 'db',
		'nonsense': 'g1',
		'test': 'g2',
		'vandalism': 'g3',
		'hoax': 'g3',
		'repost': 'g4',
		'banned': 'g5',
		'histmerge': 'g6',
		'move': 'g6',
		'xfd': 'g6',
		'disambig': 'g6',
		'movedab': 'g6',
		'copypaste': 'g6',
		'g6': 'g6',
		'author': 'g7',
		'g8': 'g8',
		'talk': 'g8',
		'subpage': 'g8',
		'redirnone': 'g8',
		'templatecat': 'g8',
		'imagepage': 'g8',
		'attack': 'g10',
		'negublp': 'g10',
		'spam': 'g11',
		'spamuser': 'g11',
		'copyvio': 'g12',
		'nocontext': 'a1',
		'foreign': 'a2',
		'nocontent': 'a3',
		'transwiki': 'a5',
		'a7': 'a7',
		'person': 'a7',
		'corp': 'a7',
		'web': 'a7',
		'band': 'a7',
		'club': 'a7',
		'animal': 'a7',
		'event': 'a7',
		'a9': 'a9',
		'a10': 'a10',
		'rediruser': 'r2',
		'redirtypo': 'r3',
		'redundantimage': 'f1',
		'noimage': 'f2',
		'fpcfail': 'f2',
		'noncom': 'f3',
		'unksource': 'f4',
		'unfree': 'f5',
		'norat': 'f6',
		'badfairuse': 'f7',
		'nowcommons': 'f8',
		'imgcopyvio': 'f9',
		'badfiletype': 'f10',
		'nopermission': 'f11',
		'catempty': 'c1',
		'userreq': 'u1',
		'nouser': 'u2',
		'gallery': 'u3',
		'policy': 't2',
		'duplicatetemplate': 't3',
		't3': 't3',
		'p1': 'p1',
		'emptyportal': 'p2'
	};

	// keep this synched with [[MediaWiki:Deletereason-dropdown]]
	Twinkle.speedy.reasonHash = {
		'reason': '',
		// General
		'nonsense': '[[WP:PN|Patent nonsense]], meaningless, or incomprehensible',
		'test': 'Test page',
		'vandalism': '[[WP:Vandalism|Vandalism]]',
		'hoax': 'Blatant [[WP:Do not create hoaxes|hoax]]',
		'repost': 'Recreation of a page that was [[WP:DEL|deleted]] per a [[WP:XFD|deletion discussion]]',
		'banned': 'Creation by a [[WP:BLOCK|blocked]] or [[WP:BAN|banned]] user in violation of block or ban',
		'histmerge': 'Temporary deletion in order to merge page histories',
		'move': 'Making way for a non-controversial move',
		'xfd': 'Deleting page per result of [[WP:XfD|deletion discussion]]',
		'disambig': 'Unnecessary disambiguation page',
		'movedab': 'Redirect to [[WP:MALPLACED|malplaced disambiguation page]]',
		'copypaste': '[[WP:CPMV|Copy-and-paste]] page move',
		'g6': 'Housekeeping and routine (non-controversial) cleanup',
		'author': 'One author who has requested deletion or blanked the page',
		'g8': 'Page dependent on a deleted or nonexistent page',
		'talk': '[[Help:Talk page|Talk page]] of a deleted or nonexistent page',
		'subpage': '[[WP:Subpages|Subpage]] of a deleted or nonexistent page',
		'redirnone': '[[Wikipedia:Redirect|redirect]] to a deleted or nonexistent page',
		'templatecat': 'Populated by deleted or retargeted templates',
		'imagepage': 'File description page for a file that does not exist',
		'attack': '[[WP:ATP|Attack page]] or negative unsourced [[WP:BLP|BLP]]',
		'negublp': 'Negative unsourced [[WP:BLP|BLP]]',
		'spam': 'Unambiguous [[WP:ADS|advertising]] or promotion',
		'copyvio': 'Unambiguous [[WP:C|copyright infringement]]',
		// Articles
		'nocontext': 'Short article without enough context to identify the subject',
		'foreign': 'Article in a foreign language that exists on another project',
		'nocontent': 'Article that has no meaningful, substantive content',
		'transwiki': 'Article that has been transwikied to another project',
		'a7': 'No explanation of the subject\'s significance (real person, animal, organization, or web content)',
		'person': 'No explanation of the subject\'s significance (real person)',
		'web': 'No explanation of the subject\'s significance (web content)',
		'corp': 'No explanation of the subject\'s significance (organization)',
		'club': 'No explanation of the subject\'s significance (organization)',
		'band': 'No explanation of the subject\'s significance (band/musician)',
		'animal': 'No explanation of the subject\'s significance (individual animal)',
		'a9': 'Music recording by redlinked artist and no indication of importance or significance',
		'a10': 'Recently created article that duplicates an existing topic',
		// Images and media
		'redundantimage': 'File redundant to another on Wikipedia',
		'noimage': 'Corrupt or empty file',
		'fpcfail': 'Unneeded file description page for a file on Commons',
		'noncom': 'File with improper license',
		'unksource': 'Lack of licensing information',
		'unfree': 'Unused non-free media',
		'norat': 'Non-free file without [[WP:RAT|fair-use rationale]]',
		'badfairuse': 'Violates [[WP:F|non-free use policy]]',
		'nowcommons': 'Media file available on Commons',
		'imgcopyvio': 'Unambiguous [[WP:COPYVIO|కాపీహక్కుల ఉల్లంఘన]]',
		'badfiletype': 'Useless media file (not an image, audio or video)',
		'nopermission': 'No evidence of permission',
		// Categories
		'catempty': 'Empty category',
		// User pages
		'userreq': 'User request to delete page in own userspace',
		'nouser': 'Userpage or subpage of a nonexistent user',
		'gallery': '[[WP:NFC|Non-free]] [[Help:Gallery|gallery]]',
		// Templates
		'policy': 'Template that unambiguously misrepresents established policy',
		't3': 'Unused, redundant template',
		// Portals
		'p1': '[[WP:P|Portal]] page that would be subject to speedy deletion as an article',
		'emptyportal': '[[WP:P|Portal]] without a substantial topic base',
		// Redirects
		'rediruser': 'Cross-[[WP:NS|namespace]] [[WP:R|redirect]] from mainspace',
		'redirtypo': 'Recently created, implausible [[WP:R|redirect]]'
	};

	Twinkle.speedy.callbacks = {
		sysop: {
			main: function(params) {
				var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'), "పేజీ తొలగింపు");

				// delete page
				var reason;
				if (params.normalized === 'db') {
					reason = prompt("తొలగింపు సారాంశం ఇవ్వండి. దాన్ని తొలగింపు చిట్టా లోకి చేరుస్తాం:", "");
				} else {
					var presetReason = "[[WP:CSD#" + params.normalized.toUpperCase() + "|" + params.normalized.toUpperCase() + "]]: " + params.reason;
					if (Twinkle.getPref("promptForSpeedyDeletionSummary").indexOf(params.normalized) !== -1) {
						reason = prompt("తొలగింపు సారాంశం ఇవ్వండి. లేదా ఆటోమాటిగ్గా తయారు చేసినది సరిపోతుందనుకుంటే OK నొక్కండి.", presetReason);
					} else {
						reason = presetReason;
					}
				}
				if (!reason || !reason.replace(/^\s*/, "").replace(/\s*$/, "")) {
					Morebits.status.error("కారణం అడుగుతున్నాం", "మీరు కారణమేమీ ఇవ్వలేదు. ");
					return;
				}
				thispage.setEditSummary(reason + Twinkle.getPref('deletionSummaryAd'));
				thispage.deletePage();

				// delete talk page
				if (params.deleteTalkPage &&
					params.normalized !== 'f8' &&
					document.getElementById('ca-talk').className !== 'new') {
					var talkpage = new Morebits.wiki.page(Morebits.wikipedia.namespaces[mw.config.get('wgNamespaceNumber') + 1] + ':' + mw.config.get('wgTitle'), "చర్చ పేజీని తొలగిస్తున్నాం");
					talkpage.setEditSummary('[[WP:CSD#G8|G8]]: తొలగించిన పేజీ యొక్క చర్చ పేజీ "' + mw.config.get('wgPageName') + '"' + Twinkle.getPref('deletionSummaryAd'));
					talkpage.deletePage();
				}

				// promote Unlink tool
				var $link, $bigtext;
				if (mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f8') {
					$link = $('<a/>', {
						'href': '#',
						'text': 'లింకులు తీసేసే పరికరం కోసం ఇక్కడ నొక్కండి',
						'css': {
							'fontSize': '130%',
							'fontWeight': 'bold'
						},
						'click': function() {
							Morebits.wiki.actionCompleted.redirect = null;
							Twinkle.speedy.dialog.close();
							Twinkle.unlink.callback("తొలగించిన దస్త్రం " + mw.config.get('wgPageName') + " వాడుకలను, దానికి ఉన్న లింకులనూ తీసేస్తున్నాం");
						}
					});
					$bigtext = $('<span/>', {
						'text': 'బ్యాక్‌లింకులను తీసేసేందుకు, దస్త్రం వాడుకలను తీసేసేందుకు',
						'css': {
							'fontSize': '130%',
							'fontWeight': 'bold'
						}
					});
					Morebits.status.info($bigtext[0], $link[0]);
				} else if (params.normalized !== 'f8') {
					$link = $('<a/>', {
						'href': '#',
						'text': 'అన్‌లింక్ పరికరం కోసం ఇక్కడ నొక్కండి',
						'css': {
							'fontSize': '130%',
							'fontWeight': 'bold'
						},
						'click': function() {
							Morebits.wiki.actionCompleted.redirect = null;
							Twinkle.speedy.dialog.close();
							Twinkle.unlink.callback("తొలగించిన పేజీకి ఉన్న లింకులను తీసేస్తున్నాం " + mw.config.get('wgPageName'));
						}
					});
					$bigtext = $('<span/>', {
						'text': 'బ్యాక్‌లింకులను తీసేసేందుకు',
						'css': {
							'fontSize': '130%',
							'fontWeight': 'bold'
						}
					});
					Morebits.status.info($bigtext[0], $link[0]);
				}

				// open talk page of first contributor
				if (params.openusertalk) {
					thispage = new Morebits.wiki.page(mw.config.get('wgPageName')); // a necessary evil, in order to clear incorrect status text
					thispage.setCallbackParameters(params);
					thispage.lookupCreator(Twinkle.speedy.callbacks.sysop.openUserTalkPage);
				}

				// delete redirects
				if (params.deleteRedirects) {
					var query = {
						'action': 'query',
						'list': 'backlinks',
						'blfilterredir': 'redirects',
						'bltitle': mw.config.get('wgPageName'),
						'bllimit': 5000 // 500 is max for normal users, 5000 for bots and sysops
					};
					var wikipedia_api = new Morebits.wiki.api('దారిమార్పుల జాబితాను తెస్తున్నాం...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
						new Morebits.status('దారిమార్పులను తొలగిస్తున్నాం'));
					wikipedia_api.params = params;
					wikipedia_api.post();
				}
			},
			openUserTalkPage: function(pageobj) {
				pageobj.getStatusElement().unlink(); // don't need it anymore
				var user = pageobj.getCreator();
				var statusIndicator = new Morebits.status('వాడుకరి ' + user, ' గారి వాడుకరి చర్చ పేజీని దిద్దుబాటు స్థితిలో తెరుస్తున్నాం..','opening...');

				var query = {
					'title': 'User talk:' + user,
					'action': 'edit',
					'preview': 'yes',
					'vanarticle': mw.config.get('wgPageName').replace(/_/g, ' ')
				};
				switch (Twinkle.getPref('userTalkPageMode')) {
					case 'tab':
						window.open(mw.util.wikiScript('index') + '?' + Morebits.queryString.create(query), '_tab');
						break;
					case 'blank':
						window.open(mw.util.wikiScript('index') + '?' + Morebits.queryString.create(query), '_blank', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800');
						break;
					case 'window':
						/* falls through */
					default:
						window.open(mw.util.wikiScript('index') + '?' + Morebits.queryString.create(query), 'twinklewarnwindow', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800');
						break;
				}

				statusIndicator.info('అయిపోయింది');
			},
			deleteRedirectsMain: function(apiobj) {
				var xmlDoc = apiobj.getXML();
				var $snapshot = $(xmlDoc).find('backlinks bl');

				var total = $snapshot.length;

				if (!total) {
					return;
				}

				var statusIndicator = apiobj.statelem;
				statusIndicator.status("0%");

				var onsuccess = function(apiobj) {
					var obj = apiobj.params.obj;
					var total = apiobj.params.total;
					var now = parseInt(100 * ++(apiobj.params.current) / total, 10) + '%';
					obj.update(now);
					apiobj.statelem.unlink();
					if (apiobj.params.current >= total) {
						obj.info(now + ' (completed)');
						Morebits.wiki.removeCheckpoint();
					}
				};

				Morebits.wiki.addCheckpoint();

				var params = $.extend({}, apiobj.params);
				params.current = 0;
				params.total = total;
				params.obj = statusIndicator;

				$snapshot.each(function(key, value) {
					var title = $(value).attr('title');
					var page = new Morebits.wiki.page(title, 'దారిమార్పు "' + title + '" ను తొలగిస్తున్నాం');
					page.setEditSummary('[[WP:CSD#G8|G8]]: Redirect to deleted page "' + mw.config.get('wgPageName') + '"' + Twinkle.getPref('deletionSummaryAd'));
					page.deletePage(onsuccess);
				});
			}
		},





		user: {
			main: function(pageobj) {
				var statelem = pageobj.getStatusElement();

				if (!pageobj.exists()) {
					statelem.error("ఈ పేజీ అసలు ఉనికి లోనే ఉన్నట్లు లేదు; బహుశా ఈసరికే తొలగించి ఉండవచ్చు");
					return;
				}

				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				statelem.status('పేజీలో ట్యాగులేమైనా ఉన్నాయేమో చూస్తున్నాం...');

				// check for existing deletion tags
				var tag = /(?:\{\{\s*(db|delete|db-.*?|speedy deletion-.*?)(?:\s*\||\s*\}\}))/.exec(text);
				if (tag) {
					statelem.error([Morebits.htmlNode('strong', tag[1]), " ఈసరికే పేజీలో ఉంది."]);
					return;
				}

				var xfd = /(?:\{\{([rsaiftcm]fd|md1|proposed deletion)[^{}]*?\}\})/i.exec(text);
				if (xfd && !confirm("పేజీలో తొలగింపు సంబంధ మూస {{" + xfd[1] + "}} ఈసరికే ఉంది. అయినా CSD మూసను చేర్చాలనే మీరు భావిస్తున్నారా?")) {
					return;
				}

				var code, parameters, i;
				if (params.normalizeds.length > 1) {
					code = "{{db-multiple";
					var breakFlag = false;
					$.each(params.normalizeds, function(index, norm) {
						code += "|" + norm.toUpperCase();
						parameters = Twinkle.speedy.getParameters(params.values[index], norm, statelem);
						if (!parameters) {
							breakFlag = true;
							return false; // the user aborted
						}
						for (i in parameters) {
							if (typeof parameters[i] === 'string' && !parseInt(i, 10)) { // skip numeric parameters - {{db-multiple}} doesn't understand them
								code += "|" + i + "=" + parameters[i];
							}
						}
					});
					if (breakFlag) {
						return;
					}
					code += "}}";
					params.utparams = [];
				} else {
					parameters = Twinkle.speedy.getParameters(params.values[0], params.normalizeds[0], statelem);
					if (!parameters) {
						return; // the user aborted
					}
					code = "{{db-" + params.values[0];
					for (i in parameters) {
						if (typeof parameters[i] === 'string') {
							code += "|" + i + "=" + parameters[i];
						}
					}
					code += "}}";
					params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
				}

				var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
				// patrol the page, if reached from Special:NewPages
				if (Twinkle.getPref('markSpeedyPagesAsPatrolled')) {
					thispage.patrol();
				}

				// Wrap SD template in noinclude tags if we are in template space.
				// Won't work with userboxes in userspace, or any other transcluded page outside template space
				if (mw.config.get('wgNamespaceNumber') === 10) { // Template:
					code = "<noinclude>" + code + "</noinclude>";
				}

				// Remove tags that become superfluous with this action
				text = text.replace(/\{\{\s*(New unreviewed article|Userspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");
				if (mw.config.get('wgNamespaceNumber') === 6) {
					// remove "move to Commons" tag - deletion-tagged files cannot be moved to Commons
					text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, "");
				}

				// Generate edit summary for edit
				var editsummary;
				if (params.normalizeds.length > 1) {
					editsummary = 'సత్వర తొలగింపును కోరారు: (';
					$.each(params.normalizeds, function(index, norm) {
						editsummary += '[[WP:CSD#' + norm.toUpperCase() + '|CSD ' + norm.toUpperCase() + ']], ';
					});
					editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma
					editsummary += ').';
				} else if (params.normalizeds[0] === "db") {
					editsummary = 'హేతువును వివరిస్తూ [[WP:CSD|సత్వర తొలగింపును]] కోరారు: \"' + parameters["1"] + '\".';
				} else if (params.values[0] === "histmerge") {
					editsummary = "[[" + parameters["1"] + "]] చరిత్ర విలీనం కోరారు ([[WP:CSD#G6|CSD G6]]).";
				} else {
					editsummary = "సత్వర తొలగింపును కోరారు: ([[WP:CSD#" + params.normalizeds[0].toUpperCase() + "|CSD " + params.normalizeds[0].toUpperCase() + "]]).";
				}

				pageobj.setPageText(code + ((params.normalizeds.indexOf('g10') !== -1) ? '' : ("\n" + text))); // cause attack pages to be blanked
				pageobj.setEditSummary(editsummary + Twinkle.getPref('summaryAd'));
				pageobj.setWatchlist(params.watch);
				pageobj.setCreateOption('nocreate');
				pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
			},

			tagComplete: function(pageobj) {
				var params = pageobj.getCallbackParameters();

				// Notification to first contributor
				if (params.usertalk) {
					var callback = function(pageobj) {
						var initialContrib = pageobj.getCreator();

						// don't notify users when their user talk page is nominated
						if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) {
							Morebits.status.warn("Notifying initial contributor: this user created their own user talk page; skipping notification");
							return;
						}

						// quick hack to prevent excessive unwanted notifications, per request. Should actually be configurable on recipient page ...
						if ((initialContrib === "Cyberbot I" || initialContrib === "SoxBot") && params.normalizeds[0] === "f2") {
							Morebits.status.warn("తొలి రచయితకు గమనింపు పంపడం: పేజీని సృష్టించినది ఒక బాటు; అంచేత గమనింపు పంపడం లేదు");
							return;
						}

						var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "తొలి రచయితకు తెలియపరుస్తున్నాం (" + initialContrib + ")"),
							notifytext, i;

						// specialcase "db" and "db-multiple"
						if (params.normalizeds.length > 1) {
							notifytext = "\n{{subst:db-notice-multiple|1=" + mw.config.get('wgPageName');
							var count = 2;
							$.each(params.normalizeds, function(index, norm) {
								notifytext += "|" + (count++) + "=" + norm.toUpperCase();
							});
						} else if (params.normalizeds[0] === "db") {
							notifytext = "\n{{subst:db-reason-notice|1=" + mw.config.get('wgPageName');
						} else {
							notifytext = "\n{{subst:db-csd-notice-custom|1=" + mw.config.get('wgPageName') + "|2=" + params.values[0];
						}

						for (i in params.utparams) {
							if (typeof params.utparams[i] === 'string') {
								notifytext += "|" + i + "=" + params.utparams[i];
							}
						}
						notifytext += (params.welcomeuser ? "" : "|nowelcome=yes") + "}} ~~~~";

						var editsummary = "గమనింపు: సత్వర తొలగింపు నామినేషను - ";
						if (params.normalizeds.indexOf("g10") === -1) { // no article name in summary for G10 deletions
							editsummary += "[[" + mw.config.get('wgPageName') + "]] పేజీని.";
						} else {
							editsummary += "ఒక దాడి పేజీని.";
						}

						usertalkpage.setAppendText(notifytext);
						usertalkpage.setEditSummary(editsummary + Twinkle.getPref('summaryAd'));
						usertalkpage.setCreateOption('recreate');
						usertalkpage.setFollowRedirect(true);
						usertalkpage.append();

						// add this nomination to the user's userspace log, if the user has enabled it
						if (params.lognomination) {
							Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
						}
					};
					var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
					thispage.lookupCreator(callback);
				}
				// or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name
				else if (params.lognomination) {
					Twinkle.speedy.callbacks.user.addToLog(params, null);
				}
			},

			// note: this code is also invoked from twinkleimage
			// the params used are:
			//   for CSD: params.values, params.normalizeds  (note: normalizeds is an array)
			//   for DI: params.fromDI = true, params.type, params.normalized  (note: normalized is a string)
			addToLog: function(params, initialContrib) {
				var wikipedia_page = new Morebits.wiki.page("User:" + mw.config.get('wgUserName') + "/" + Twinkle.getPref('speedyLogPageName'), "Adding entry to userspace log");
				params.logInitialContrib = initialContrib;
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.speedy.callbacks.user.saveLog);
			},

			saveLog: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				// add blurb if log page doesn't exist
				if (!pageobj.exists()) {
					text =
						"ఇది, ఈ వాడుకరి [[WP:TW|Twinkle]] లోని CSD మాడ్యూలు వాడి చేసిన సత్వర తొలగింపు నామినేషన్ల చిట్టా.\n\n" +
						"ఈ చిట్టా అక్కర్లేదని మీరు భావిస్తే, [[వికీపీడియా:Twinkle/Preferences|అభిరుచుల ప్యానెల్]] లో దీన్ని ఆఫ్ చెయ్యవచ్చు." +
						"ఈ పేజీని [[WP:CSD#U1|CSD U1]] కింద సత్వర తొలగింపుకు నామినేటు చెయ్యండి.\n";
					if (Morebits.userIsInGroup("sysop")) {
						text += "\nట్వింకిల్ లోని సత్వర తొలగింపు అంశాన్ని వాడి నేరుగా చేసిన తొలగింపులు ఈ చిట్టా లోకి చేరవు.\n";
					}
				}

				// create monthly header
				var date = new Date();
				var headerRe = new RegExp("^==+\\s*" + date.getUTCMonthName() + "\\s+" + date.getUTCFullYear() + "\\s*==+", "m");
				if (!headerRe.exec(text)) {
					text += "\n\n=== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ===";
				}

				text += "\n# [[:" + mw.config.get('wgPageName') + "]]: ";
				if (params.fromDI) {
					text += "DI [[WP:CSD#" + params.normalized.toUpperCase() + "|CSD " + params.normalized.toUpperCase() + "]] (" + params.type + ")";
				} else {
					if (params.normalizeds.length > 1) {
						text += "multiple criteria (";
						$.each(params.normalizeds, function(index, norm) {
							text += "[[WP:CSD#" + norm.toUpperCase() + "|" + norm.toUpperCase() + ']], ';
						});
						text = text.substr(0, text.length - 2); // remove trailing comma
						text += ')';
					} else if (params.normalizeds[0] === "db") {
						text += "{{tl|db-reason}}";
					} else {
						text += "[[WP:CSD#" + params.normalizeds[0].toUpperCase() + "|CSD " + params.normalizeds[0].toUpperCase() + "]] ({{tl|db-" + params.values[0] + "}})";
					}
				}

				if (params.logInitialContrib) {
					text += "; notified {{user|" + params.logInitialContrib + "}}";
				}
				text += " ~~~~~\n";

				pageobj.setPageText(text);
				pageobj.setEditSummary("[[" + mw.config.get('wgPageName') + "]] సత్వర తొలగింపు నామినేషన్ను చిట్టా లోకి చేరుస్తున్నాం." + Twinkle.getPref('summaryAd'));
				pageobj.setCreateOption("recreate");
				pageobj.save();
			}
		}
	};

	// prompts user for parameters to be passed into the speedy deletion tag
	Twinkle.speedy.getParameters = function twinklespeedyGetParameters(value, normalized, statelem) {
		var parameters = [];
		switch (normalized) {
			case 'db':
				var dbrationale = prompt('కారణం ఇవ్వండి - అది తప్పనిసరి.   \n\"ఈ పేజీ సత్వర తొలగింపుకు అనుగుణంగా ఉందని ఎందుకు భావిస్తున్నానంటే::\"', "");
				if (!dbrationale || !dbrationale.replace(/^\s*/, "").replace(/\s*$/, "")) {
					statelem.error('కారణం తప్పనిసరిగా ఇవ్వాలి. వాడుకరి అర్ధంతరంగా ఆపేసారు.');
					return null;
				}
				parameters["1"] = dbrationale;
				break;
			case 'u1':
				if (mw.config.get('wgNamespaceNumber') === 3 && !((/\//).test(mw.config.get('wgTitle')))) {
					var u1rationale = prompt('[CSD U1] ఈ వాడుకరి చర్చ పేజీని ఎందుకు తొలగించాలో కారణం ఇవ్వండి. అది తప్పనిసరి:', "");
					if (!u1rationale || !u1rationale.replace(/^\s*/, "").replace(/\s*$/, "")) {
						statelem.error('కారణం తప్పనిసరిగా ఇవ్వాలి. వాడుకరి అర్ధంతరంగా ఆపేసారు.');
						return null;
					}
					parameters.rationale = u1rationale;
				}
				break;
			case 'f8':
				var pagenamespaces = mw.config.get('wgPageName').replace('_', ' ');
				var filename = prompt('[CSD F8] కామన్సులో ఉన్న దస్త్రం పేరు ఇవ్వండి:', pagenamespaces);
				if (filename === null) {
					statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
					return null;
				}
				if (filename !== '' && filename !== pagenamespaces) {
					if (filename.indexOf("Image:") === 0 || filename.indexOf("దస్త్రం:") === 0) {
						parameters["1"] = filename;
					} else {
						statelem.error("బొమ్మ పేరులో దస్త్రం: అనే ఆదిపదం లేదు. ఆపేసాం.");
						return null;
					}
				}
				parameters.date = "~~~~~";
				break;
			case 'g4':
				var deldisc = prompt('[CSD G4] తొలగింపు చర్చ జరిగిన పేజీ పేరు ఇవ్వండి.   \nగమనిక: మామూలు AfD, MfD చర్చల కోసమైతే OK నొక్కండి - లింకు ఆటోమాటిగ్గా ఇస్తాం..', "");
				if (deldisc === null) {
					statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
					return null;
				}
				if (deldisc !== "" && deldisc.substring(0, 9) !== "Wikipedia" && deldisc.substring(0, 3) !== "WP:") {
					statelem.error('తొలగింపు చర్చ జరిగిన పేజీ పేరు, ఇచ్చి ఉంటే, అది "వికీపీడియా:" తో మొదలవ్వాలి. ఇకపై ముందుకు పోలేం.');
					return null;
				}
				parameters["1"] = deldisc;
				break;
			case 'g5':
				var banneduser = prompt('[CSD G5] నిషేధిత వాడుకరి వాడుకరిపేరు తెలిస్తే, ఇవ్వండి:', "");
				if (banneduser === null) {
					statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
					return null;
				}
				parameters["1"] = banneduser;
				break;
			case 'g6':
				switch (value) {
					case 'histmerge':
						var mergetitle = prompt('[CSD G6: history merge] దీనిలోకి విలీనం చెయ్యాల్సిన పేజీ పేరు ఇవ్వండి:', "");
						if (mergetitle === null) {
							statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
							return null;
						}
						parameters["1"] = mergetitle;
						break;
					case 'move':
						var title = prompt('[CSD G6: move] ఇక్కడికి తరలించాల్సిన పేజీ పేరు ఇవ్వండి:', "");
						if (title === null) {
							statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
							return null;
						}
						var reason = prompt('[CSD G6: move] ఈ తరలింపుకు కారణం ఇవ్వండి:', "");
						if (reason === null) {
							statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
							return null;
						}
						parameters["1"] = title;
						parameters["2"] = reason;
						break;
					case 'xfd':
						var votepage = prompt('[CSD G6: xfd] తొలగింపు చర్చ జరిగిన పేజీ పూర్తి లింకును [[ ]] లేకుండా ఇవ్వండి:', "");
						if (votepage === null) {
							statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
							return null;
						}
						parameters.fullvotepage = votepage;
						break;
					case 'copypaste':
						var copytitle = prompt('[CSD G6: copypaste] ఇక్కడికి కాపీ చేసిన ఒరిజినలు పేజీ పేరును ఇవ్వండి:', "");
						if (copytitle === null) {
							statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
							return null;
						}
						parameters["1"] = copytitle;
						break;
					case 'g6':
						var g6rationale = prompt('[CSD G6] హేతువు ఇవ్వండి (ఇవ్వదలచకపోతే, ఖాళీగా వదిలెయ్యండి):', "");
						if (g6rationale === null) {
							statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
							return null;
						}
						if (g6rationale !== '') {
							parameters.rationale = g6rationale;
						}
						break;
					default:
						break;
				}
				break;
			case 'g7':
				if (Twinkle.getPref('speedyPromptOnG7')) {
					var g7rationale = prompt('[CSD G7] హేతువు ఇవ్వండి (-కర్త తొలగించమని అభ్యర్ధించిన చోటికి లింకు ఇస్తూ. ఇవ్వదలచకపోతే, ఖాళీగా వదిలెయ్యండి):', "");
					if (g7rationale === null) {
						statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
						return null;
					}
					if (g7rationale !== '') {
						parameters.rationale = g7rationale;
					}
				}
				break;
			case 'g12':
				var url = prompt('[CSD G12] URL తెలిస్తే, "http://" తో సహా  ఇవ్వండి:', "");
				if (url === null) {
					statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
					return null;
				}
				parameters.url = url;
				break;
			case 'f9':
				var f9url = prompt('[CSD F9] కాపీహక్కుల స్వంతదారు సైటు URL ఇవ్వండి - "http://" తో సహా. \n URL ఇవ్వలేని పక్షంలో CSD F9 వాడకండి. (మినహాయింపు: మూలాలు అంతర్జాలేతరమైనవైతే, ఈ పెట్టెను ఖాళీగా వదిలెయ్యండి)', "");
				if (f9url === null) {
					statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
					return null;
				}
				parameters.url = f9url;
				break;
			case 'a2':
				var source = prompt('[CSD A2] Enter an interwiki link to the article on the foreign-language wiki (for example, "en:Hello"):', "");
				if (source === null) {
					statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
					return null;
				}
				parameters.source = source;
				break;
			case 'a10':
				var duptitle = prompt('[CSD A10] ఏ వ్యాసానికి నకలో దాని పేరు ఇవ్వండి:', "");
				if (duptitle === null) {
					statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
					return null;
				}
				parameters.article = duptitle;
				break;
			case 'f1':
				var img = prompt('[CSD F1] ఇది ఏ దస్త్రానికి పునరుక్తమో దాని పేరును, "దస్త్రం:" అనే ఆదిపదం లేకుండా ఇవ్వండి:', "");
				if (img === null) {
					statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
					return null;
				}
				parameters.filename = img;
				break;
			case 't3':
				switch (value) {
					case 'duplicatetemplate':
						var template = prompt('[CSD T3] ఇది ఏ మూసకు పునరుక్తమో దాని పేరును, "మూస:" అనే ఆదిపదం లేకుండా ఇవ్వండి:', "");
						if (template === null) {
							statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
							return null;
						}
						parameters["1"] = "~~~~~";
						parameters["2"] = template;
						break;
					default:
						var t3rationale = prompt('[CSD T3] హేతువును ఇవ్వండి - అది తప్పనిసరి:', "");
						if (!t3rationale || !t3rationale.replace(/^\s*/, "").replace(/\s*$/, "")) {
							statelem.error('వాడుకరి అర్ధంతరంగా ఆపేసారు.');
							return null;
						}
						parameters["1"] = "~~~~~";
						parameters.rationale = t3rationale;
						break;
				}
				break;
			case 'g10':
				parameters.blanked = 'yes';
				// it is actually blanked elsewhere in code, but setting the flag here
				break;
			case 'p1':
				var criterion = prompt('[CSD P1] Enter the code of the article CSD criterion which this portal falls under:   \n\n(A1 = no context, A3 = no content, A7 = non-notable, A10 = duplicate)', "");
				if (!criterion || !criterion.replace(/^\s*/, "").replace(/\s*$/, "")) {
					statelem.error('మీరు కారణం ఇవ్వాలి. వాడుకరి అర్ధంతరంగా ఆపేసారు .');
					return null;
				}
				parameters["1"] = criterion;
				break;
			default:
				break;
		}
		return parameters;
	};

	// function for processing talk page notification template parameters
	Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) {
		var utparams = [];
		switch (normalized) {
			case 'db':
				utparams["2"] = parameters["1"];
				break;
			case 'a10':
				utparams.key1 = "article";
				utparams.value1 = parameters.article;
				break;
			default:
				break;
		}
		return utparams;
	};


	Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) {
		var values = (e.target.form ? e.target.form : e.target).getChecked('csd');
		if (values.length === 0) {
			alert("ఒక కారణాన్ని ఎంచుకోండి!");
			return null;
		}
		return values;
	};

	Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) {
		mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' ')); // for queen/king/whatever and country!
		var form = (e.target.form ? e.target.form : e.target);

		var tag_only = form.tag_only;
		if (tag_only && tag_only.checked) {
			Twinkle.speedy.callback.evaluateUser(e);
			return;
		}

		var value = Twinkle.speedy.resolveCsdValues(e)[0];
		if (!value) {
			return;
		}
		var normalized = Twinkle.speedy.normalizeHash[value];

		var params = {
			value: value,
			normalized: normalized,
			watch: Twinkle.getPref('watchSpeedyPages').indexOf(normalized) !== -1,
			reason: Twinkle.speedy.reasonHash[value],
			openusertalk: Twinkle.getPref('openUserTalkPageOnSpeedyDelete').indexOf(normalized) !== -1,
			deleteTalkPage: form.talkpage && form.talkpage.checked,
			deleteRedirects: form.redirects.checked
		};

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(form);

		Twinkle.speedy.callbacks.sysop.main(params);
	};

	Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
		mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' ')); // for queen/king/whatever and country!
		var form = (e.target.form ? e.target.form : e.target);

		if (e.target.type === "checkbox") {
			return;
		}

		var values = Twinkle.speedy.resolveCsdValues(e);
		if (!values) {
			return;
		}
		//var multiple = form.multiple.checked;
		var normalizeds = [];
		$.each(values, function(index, value) {
			var norm = Twinkle.speedy.normalizeHash[value];

			// for sysops only
			if (['f4', 'f5', 'f6', 'f11'].indexOf(norm) !== -1) {
				alert("CSD మాడ్యూలును వాడి F4, F5, F6, F11 ట్యాగులు పెట్టడం కుదరదు. దాని బదులు DI వాడండి. లేదా, మీ ఉద్దేశం పేజీని తొలగించడం అయితే   \"పేజీలో ట్యాగు పెట్టు అంతే, తొలగించవద్దు\" లో టిక్కు తీసెయ్యండి.");
				return;
			}

			normalizeds.push(norm);
		});

		// analyse each criterion to determine whether to watch the page/notify the creator
		var watchPage = false;
		$.each(normalizeds, function(index, norm) {
			if (Twinkle.getPref('watchSpeedyPages').indexOf(norm) !== -1) {
				watchPage = true;
				return false; // break
			}
		});

		var notifyuser = false;
		if (form.notify.checked) {
			$.each(normalizeds, function(index, norm) {
				if (Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').indexOf(norm) !== -1) {
					if (norm === 'g6' && ['disambig', 'copypaste'].indexOf(values[index]) === -1) {
						return true;
					}
					notifyuser = true;
					return false; // break
				}
			});
		}

		var welcomeuser = false;
		if (notifyuser) {
			$.each(normalizeds, function(index, norm) {
				if (Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1) {
					welcomeuser = true;
					return false; // break
				}
			});
		}

		var csdlog = false;
		if (Twinkle.getPref('logSpeedyNominations')) {
			$.each(normalizeds, function(index, norm) {
				if (Twinkle.getPref('noLogOnSpeedyNomination').indexOf(norm) === -1) {
					csdlog = true;
					return false; // break
				}
			});
		}

		var params = {
			values: values,
			normalizeds: normalizeds,
			watch: watchPage,
			usertalk: notifyuser,
			welcomeuser: welcomeuser,
			lognomination: csdlog
		};

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(form);

		Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
		Morebits.wiki.actionCompleted.notice = "ట్యాగులు పెట్టడం పూర్తయింది";

		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "Tagging page");
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.load(Twinkle.speedy.callbacks.user.main);
	};

	/*
	 ****************************************
	 *** twinkleunlink.js: Unlink module
	 ****************************************
	 * Mode of invocation:     Tab ("Unlink")
	 * Active on:              Non-special pages
	 * Config directives in:   TwinkleConfig
	 */

	Twinkle.unlink = function twinkleunlink() {
		if (mw.config.get('wgNamespaceNumber') < 0) {
			return;
		}
		twAddPortletLink(Twinkle.unlink.callback, "Unlink", "tw-unlink", "Unlink backlinks");
	};

	Twinkle.unlink.getChecked2 = function twinkleunlinkGetChecked2(nodelist) {
		if (!(nodelist instanceof NodeList) && !(nodelist instanceof HTMLCollection)) {
			return nodelist.checked ? [nodelist.values] : [];
		}
		var result = [];
		for (var i = 0; i < nodelist.length; ++i) {
			if (nodelist[i].checked) {
				result.push(nodelist[i].values);
			}
		}
		return result;
	};

	// the parameter is used when invoking unlink from admin speedy
	Twinkle.unlink.callback = function(presetReason) {
		var Window = new Morebits.simpleWindow(800, 400);
		Window.setTitle("బ్యాక్‌లింకులను తీసివెయ్యి");
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#unlink");

		var form = new Morebits.quickForm(Twinkle.unlink.callback.evaluate);
		form.append({
			type: 'textarea',
			name: 'reason',
			label: 'కారణం: ',
			value: (presetReason ? presetReason : '')
		});

		var query;
		if (mw.config.get('wgNamespaceNumber') === 6) { // File:
			query = {
				'action': 'query',
				'list': ['backlinks', 'imageusage'],
				'bltitle': mw.config.get('wgPageName'),
				'iutitle': mw.config.get('wgPageName'),
				'bllimit': Morebits.userIsInGroup('sysop') ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
				'iulimit': Morebits.userIsInGroup('sysop') ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
				'blnamespace': Twinkle.getPref('unlinkNamespaces'),
				'iunamespace': Twinkle.getPref('unlinkNamespaces')
			};
		} else {
			query = {
				'action': 'query',
				'list': 'backlinks',
				'bltitle': mw.config.get('wgPageName'),
				'blfilterredir': 'nonredirects',
				'bllimit': Morebits.userIsInGroup('sysop') ? 5000 : 500, // 500 is max for normal users, 5000 for bots and sysops
				'blnamespace': Twinkle.getPref('unlinkNamespaces')
			};
		}
		var wikipedia_api = new Morebits.wiki.api('Grabbing backlinks', query, Twinkle.unlink.callbacks.display.backlinks);
		wikipedia_api.params = {
			form: form,
			Window: Window,
			image: mw.config.get('wgNamespaceNumber') === 6
		};
		wikipedia_api.post();

		var root = document.createElement('div');
		root.style.padding = '15px'; // just so it doesn't look broken
		Morebits.status.init(root);
		wikipedia_api.statelem.status("లోడు చేస్తున్నాం...");
		Window.setContent(root);
		Window.display();
	};

	Twinkle.unlink.callback.evaluate = function twinkleunlinkCallbackEvaluate(event) {
		mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' ')); // for queen/king/whatever and country!

		Twinkle.unlink.backlinksdone = 0;
		Twinkle.unlink.imageusagedone = 0;

		function processunlink(pages, imageusage) {
			var statusIndicator = new Morebits.status((imageusage ? 'దస్త్రాన్ని వాడిన చోట్ల లింకులు తీసేస్తున్నాం' : 'Unlinking backlinks'), '0%');
			var total = pages.length; // removing doubling of this number - no apparent reason for it

			Morebits.wiki.addCheckpoint();

			if (!pages.length) {
				statusIndicator.info('100% (completed)');
				Morebits.wiki.removeCheckpoint();
				return;
			}

			// get an edit token
			var params = {
				reason: reason,
				imageusage: imageusage,
				globalstatus: statusIndicator,
				current: 0,
				total: total
			};
			for (var i = 0; i < pages.length; ++i) {
				var myparams = $.extend({}, params);
				var articlepage = new Morebits.wiki.page(pages[i], 'Unlinking in article "' + pages[i] + '"');
				articlepage.setCallbackParameters(myparams);
				articlepage.load(imageusage ? Twinkle.unlink.callbacks.unlinkImageInstances : Twinkle.unlink.callbacks.unlinkBacklinks);
			}
		}

		var reason = event.target.reason.value;
		var backlinks, imageusage;
		if (event.target.backlinks) {
			backlinks = Twinkle.unlink.getChecked2(event.target.backlinks);
		}
		if (event.target.imageusage) {
			imageusage = Twinkle.unlink.getChecked2(event.target.imageusage);
		}

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(event.target);
		Morebits.wiki.addCheckpoint();
		if (backlinks) {
			processunlink(backlinks, false);
		}
		if (imageusage) {
			processunlink(imageusage, true);
		}
		Morebits.wiki.removeCheckpoint();
	};

	Twinkle.unlink.backlinksdone = 0;
	Twinkle.unlink.imageusagedone = 0;

	Twinkle.unlink.callbacks = {
		display: {
			backlinks: function twinkleunlinkCallbackDisplayBacklinks(apiobj) {
				var xmlDoc = apiobj.responseXML;
				var havecontent = false;
				var list, namespaces, i;

				if (apiobj.params.image) {
					var imageusage = $(xmlDoc).find('query imageusage iu');
					list = [];
					for (i = 0; i < imageusage.length; ++i) {
						var usagetitle = imageusage[i].getAttribute('title');
						list.push({
							label: usagetitle,
							value: usagetitle,
							checked: true
						});
					}
					if (!list.length) {
						apiobj.params.form.append({
							type: 'div',
							label: 'ఈ దస్త్రాన్ని వాడుతున్న సందర్భాలేమీ కనిపించలేదు.'
						});
					} else {
						apiobj.params.form.append({
							type: 'header',
							label: 'దస్త్రపు వాడుక '
						});
						namespaces = [];
						$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
							namespaces.push(Morebits.wikipedia.namespacesFriendly[v]);
						});
						apiobj.params.form.append({
							type: 'div',
							label: "Selected namespaces: " + namespaces.join(', '),
							tooltip: "[[WP:TWPREFS]] వద్ద ఉన్న మీ ట్వింకిల్ అభిరుచుల్లో దీన్ని మార్చుకోవచ్చు"
						});
						if ($(xmlDoc).find('query-continue').length) {
							apiobj.params.form.append({
								type: 'div',
								label: "తొలి " + list.length.toString() + " దస్త్రపు వాడుకలను చూపించాం."
							});
						}
						apiobj.params.form.append({
							type: 'checkbox',
							name: 'imageusage',
							list: list
						});
						havecontent = true;
					}
				}

				var backlinks = $(xmlDoc).find('query backlinks bl');
				if (backlinks.length > 0) {
					list = [];
					for (i = 0; i < backlinks.length; ++i) {
						var title = backlinks[i].getAttribute('title');
						list.push({
							label: title,
							value: title,
							checked: true
						});
					}
					apiobj.params.form.append({
						type: 'header',
						label: 'బ్యాక్‌లింకులు'
					});
					namespaces = [];
					$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
						namespaces.push(Morebits.wikipedia.namespacesFriendly[v]);
					});
					apiobj.params.form.append({
						type: 'div',
						label: "ఎంచుకున్న పేరుబరులు: " + namespaces.join(', '),
						tooltip: "[[WP:TWPREFS]] వద్ద ఉన్న మీ ట్వింకిల్ అభిరుచుల్లో దీన్ని మార్చుకోవచ్చు"
					});
					if ($(xmlDoc).find('query-continue').length) {
						apiobj.params.form.append({
							type: 'div',
							label: "తొలి " + list.length.toString() + " బ్యాక్‌లింకులను చూపించాం."
						});
					}
					apiobj.params.form.append({
						type: 'checkbox',
						name: 'బ్యాక్‌లింకులు',
						list: list
					});
					havecontent = true;
				} else {
					apiobj.params.form.append({
						type: 'div',
						label: 'బ్యాక్‌లింకులేమీ కనబడలేదు.'
					});
				}

				if (havecontent) {
					apiobj.params.form.append({
						type: 'submit'
					});
				}

				var result = apiobj.params.form.render();
				apiobj.params.Window.setContent(result);
			}
		},
		unlinkBacklinks: function twinkleunlinkCallbackUnlinkBacklinks(pageobj) {
			var text, oldtext;
			text = oldtext = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();

			var wikiPage = new Morebits.wikitext.page(text);
			wikiPage.removeLink(mw.config.get('wgPageName'));
			text = wikiPage.getText();
			if (text === oldtext) {
				// Nothing to do, return
				Twinkle.unlink.callbacks.success(pageobj);
				Morebits.wiki.actionCompleted();
				return;
			}

			pageobj.setPageText(text);
			pageobj.setEditSummary("Removing link(s) to \"" + mw.config.get('wgPageName') + "\": " + params.reason + "." + Twinkle.getPref('summaryAd'));
			pageobj.setCreateOption('nocreate');
			pageobj.save(Twinkle.unlink.callbacks.success);
		},
		unlinkImageInstances: function twinkleunlinkCallbackUnlinkImageInstances(pageobj) {
			var text, oldtext;
			text = oldtext = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();

			var wikiPage = new Morebits.wikitext.page(text);
			wikiPage.commentOutImage(mw.config.get('wgTitle'), 'Commented out');
			text = wikiPage.getText();
			if (text === oldtext) {
				// Nothing to do, return
				Twinkle.unlink.callbacks.success(pageobj);
				Morebits.wiki.actionCompleted();
				return;
			}

			pageobj.setPageText(text);
			pageobj.setEditSummary("Commenting out use(s) of file \"" + mw.config.get('wgPageName') + "\": " + params.reason + "." + Twinkle.getPref('summaryAd'));
			pageobj.setCreateOption('nocreate');
			pageobj.save(Twinkle.unlink.callbacks.success);
		},
		success: function twinkleunlinkCallbackSuccess(pageobj) {
			var params = pageobj.getCallbackParameters();
			var total = params.total;
			var now = parseInt(100 * (params.imageusage ? ++(Twinkle.unlink.imageusagedone) : ++(Twinkle.unlink.backlinksdone)) / total, 10) + '%';
			params.globalstatus.update(now);
			if ((params.imageusage ? Twinkle.unlink.imageusagedone : Twinkle.unlink.backlinksdone) >= total) {
				params.globalstatus.info(now + ' (completed)');
				Morebits.wiki.removeCheckpoint();
			}
		}
	};

	/*
	 ****************************************
	 *** twinklewarn.js: Warn module
	 ****************************************
	 * Mode of invocation:     Tab ("Warn")
	 * Active on:              User talk pages
	 * Config directives in:   TwinkleConfig
	 */

	Twinkle.warn = function twinklewarn() {
		if (mw.config.get('wgNamespaceNumber') === 3) {
			twAddPortletLink(Twinkle.warn.callback, "Warn", "tw-warn", "Warn/notify user");
		}

		// modify URL of talk page on rollback success pages
		if (mw.config.get('wgAction') === 'rollback') {
			var $vandalTalkLink = $("#mw-rollback-success").find(".mw-usertoollinks a").first();
			$vandalTalkLink.css("font-weight", "bold");
			$vandalTalkLink.wrapInner($("<span/>").attr("title", "If appropriate, you can use Twinkle to warn the user about their edits to this page."));

			var extraParam = "vanarticle=" + mw.util.rawurlencode(mw.config.get("wgPageName").replace(/_/g, " "));
			var href = $vandalTalkLink.attr("href");
			if (href && href.indexOf("?") === -1) {
				$vandalTalkLink.attr("href", href + "?" + extraParam);
			} else {
				$vandalTalkLink.attr("href", href + "&" + extraParam);
			}
		}
	};

	Twinkle.warn.callback = function twinklewarnCallback() {
		if (!twinkleUserAuthorized) {
			alert("మీ ఖాతా మరీ కొత్తది, ట్వింకిల్ వాడలేరు.");
			return;
		}
		if (mw.config.get('wgTitle').split('/')[0] === mw.config.get('wgUserName') &&
			!confirm('You are about to warn yourself! Are you sure you want to proceed?')) {
			return;
		}

		var Window = new Morebits.simpleWindow(600, 440);
		Window.setTitle("వాడుకరికి హెచ్చరిక/గమనింపు పంపు");
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("హెచ్చరిక స్థాయిని ఎంచుకోవడం", "WP:UWUL#Levels");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#warn");

		var form = new Morebits.quickForm(Twinkle.warn.callback.evaluate);
		var main_select = form.append({
			type: 'field',
			label: 'పంపాల్సిన హెచ్చరిక/గమనింపు రకాన్ని ఎంచుకోండి',
			tooltip: 'ముందు ప్రధాన హెచ్చరిక గుంపును ఎంచుకోండి, ఆ తరువాత నిర్దుష్ట హెచ్చరికను ఎంచుకోండి.'
		});

		var main_group = main_select.append({
			type: 'select',
			name: 'main_group',
			event: Twinkle.warn.callback.change_category
		});

		var defaultGroup = parseInt(Twinkle.getPref('defaultWarningGroup'), 10);
		main_group.append({
			type: 'option',
			label: 'సాధారణ గమనింపు (1)',
			value: 'level1',
			selected: (defaultGroup === 1 || defaultGroup < 1 || (Morebits.userIsInGroup('sysop') ? defaultGroup > 8 : defaultGroup > 7))
		});
		main_group.append({
			type: 'option',
			label: 'జాగ్రత్త (2)',
			value: 'level2',
			selected: (defaultGroup === 2)
		});
		main_group.append({
			type: 'option',
			label: 'హెచ్చరిక (3)',
			value: 'level3',
			selected: (defaultGroup === 3)
		});
		main_group.append({
			type: 'option',
			label: 'చివరి హెచ్చరిక (4)',
			value: 'level4',
			selected: (defaultGroup === 4)
		});
		main_group.append({
			type: 'option',
			label: 'ఒకే హెచ్చరిక (4im)',
			value: 'level4im',
			selected: (defaultGroup === 5)
		});
		main_group.append({
			type: 'option',
			label: 'ఒక్కసారి మాత్రమే పంపే గమనింపులు',
			value: 'singlenotice',
			selected: (defaultGroup === 6)
		});
		main_group.append({
			type: 'option',
			label: 'ఒక్కసారి మాత్రమే పంపే హెచ్చరికలు',
			value: 'singlewarn',
			selected: (defaultGroup === 7)
		});
		if (Morebits.userIsInGroup('sysop')) {
			main_group.append({
				type: 'option',
				label: 'నిరోధం',
				value: 'block',
				selected: (defaultGroup === 8)
			});
		}

		main_select.append({
			type: 'select',
			name: 'sub_group',
			event: Twinkle.warn.callback.change_subcategory
		}); //Will be empty to begin with.

		form.append({
			type: 'input',
			name: 'article',
			label: 'లింకు ఇచ్చిన వ్యాసం',
			value: (Morebits.queryString.exists('vanarticle') ? Morebits.queryString.get('vanarticle') : ''),
			tooltip: 'An article can be linked within the notice, perhaps because it was a revert to said article that dispatched this notice. Leave empty for no article to be linked.'
		});

		var more = form.append({
			type: 'field',
			name: 'reasonGroup',
			label: 'హెచ్చరిక సమాచారం'
		});
		more.append({
			type: 'textarea',
			label: 'ఐచ్ఛిక సందేశం:',
			name: 'reason',
			tooltip: 'కారణం ఇవ్వవచ్చు. లేదా మరింత వివరమైన నోటీసు ఇవ్వవచ్చు'
		});

		var previewlink = document.createElement('a');
		$(previewlink).click(function() {
			Twinkle.warn.callbacks.preview(result); // |result| is defined below
		});
		previewlink.style.cursor = "pointer";
		previewlink.textContent = 'Preview';
		more.append({
			type: 'div',
			id: 'warningpreview',
			label: [previewlink]
		});
		more.append({
			type: 'div',
			id: 'twinklewarn-previewbox',
			style: 'display: none'
		});

		more.append({
			type: 'submit',
			label: 'పంపించు'
		});

		var result = form.render();
		Window.setContent(result);
		Window.display();
		result.main_group.root = result;
		result.previewer = new Morebits.wiki.preview($(result).find('div#twinklewarn-previewbox').last()[0]);

		// We must init the first choice (General Note);
		var evt = document.createEvent("Event");
		evt.initEvent('change', true, true);
		result.main_group.dispatchEvent(evt);
	};

	// This is all the messages that might be dispatched by the code
	// Each of the individual templates require the following information:
	//   label (required): A short description displayed in the dialog
	//   summary (required): The edit summary used. If an article name is entered, the summary is postfixed with "on [[article]]", and it is always postfixed with ". $summaryAd"
	//   suppressArticleInSummary (optional): Set to true to suppress showing the article name in the edit summary. Useful if the warning relates to attack pages, or some such.
	Twinkle.warn.messages = {
		level1: {
			"uw-vandalism1": {
				label: "దుశ్చర్య",
				summary: "సాధారణ గమనిక: పనికిరాని దిద్దుబాట్లు"
			},
			"uw-test1": {
				label: "పరీక్షాత్మక దిద్దుబాట్లు",
				summary: "సాధారణ గమనిక: పరీక్షాత్మక దిద్దుబాట్లు"
			},
			"uw-delete1": {
				label: "కంటెంటు తీసివేత, తుడిచివేత",
				summary: "సాధారణ గమనిక: కంటెంటు తీసివేత, తుడిచివేత"
			},
			"uw-redirect1": {
				label: "దుర్భావనతో దారిమార్పులు సృష్టించడం",
				summary: "సాధారణ గమనిక: దుర్భావనతో దారిమార్పులు సృష్టించడం"
			},
			"uw-tdel1": {
				label: "నిర్వహణ మూసలను తీసెయ్యడం",
				summary: "సాధారణ గమనిక: నిర్వహణ మూసలను తీసెయ్యడం"
			},
			"uw-joke1": {
				label: "అనుచిత హాస్యాన్ని వాడడం ",
				summary: "సాధారణ గమనిక: అనుచిత హాస్యాన్ని వాడడం "
			},
			"uw-create1": {
				label: "అనుచిత పేజీలను సృష్టించడం",
				summary: "సాధారణ గమనిక: అనుచిత పేజీలను సృష్టించడం"
			},
			"uw-upload1": {
				label: "విజ్ఞాన సర్వస్వ యోగ్యం కాని బొమ్మలను ఎక్కించడం",
				summary: "సాధారణ గమనిక: విజ్ఞాన సర్వస్వ యోగ్యం కాని బొమ్మలను ఎక్కించడం"
			},
			"uw-image1": {
				label: "బొమ్మల సంబంధ దుశ్చర్య",
				summary: "సాధారణ గమనిక: బొమ్మల సంబంధ దుశ్చర్య"
			},
			"uw-ics1": {
				label: "కాపీహక్కుల స్థితి లేకుండా పేజీలను ఎక్కించడం",
				summary: "సాధారణ గమనిక: కాపీహక్కుల స్థితి లేకుండా పేజీలను ఎక్కించడం"
			},
			"uw-idt1": {
				label: "దస్త్రం తొలగింపు ట్యాగులను తీసెయ్యడం",
				summary: "సాధారణ గమనిక: దస్త్రం తొలగింపు ట్యాగులను తీసెయ్యడం"
			},
			"uw-spam1": {
				label: "స్పాము లింకులను చేర్చడం",
				summary: "సాధారణ గమనిక: స్పాము లింకులను చేర్చడం"
			},
			"uw-advert1": {
				label: "వికీపీడియాను వాపార ప్రకటనలకూ, ప్రచారానికీ వాడుకోవడం",
				summary: "సాధారణ గమనిక: వికీపీడియాను వాపార ప్రకటనలకూ, ప్రచారానికీ వాడుకోవడం"
			},
			"uw-npov1": {
				label: "నిష్పాక్షిక దృక్కోణానికి కట్టుబడక పోవడం",
				summary: "సాధారణ గమనిక: నిష్పాక్షిక దృక్కోణానికి కట్టుబడక పోవడం"
			},
			"uw-unsourced1": {
				label: "మూలాల్లేని లేదా సరిగా ఉల్లేఖించని కంటెంటును చేర్చడం",
				summary: "సాధారణ గమనిక: మూలాల్లేని లేదా సరిగా ఉల్లేఖించని కంటెంటును చేర్చడం"
			},
			"uw-error1": {
				label: "కావాలని తప్పుడు వాస్తవాలను చేర్చడం",
				summary: "సాధారణ గమనిక: కావాలని తప్పుడు వాస్తవాలను చేర్చడం"
			},
			"uw-nor1": {
				label: "మౌలిక పరిశోధనను, మూలంలో ఉన్న కంటెంటు యొక్క ప్రచురితం కాని సంక్షిప్త సారాంశాన్ని చేర్చడం",
				summary: "సాధారణ గమనిక: మౌలిక పరిశోధనను, మూలంలో ఉన్న కంటెంటు యొక్క ప్రచురితం కాని సంక్షిప్త సారాంశాన్ని చేర్చడం"
			},
			"uw-biog1": {
				label: "జీవించి ఉన్న వ్యక్తులకు సంబంధించి వివాదాస్పద సమాచారాన్ని మూలాల్లేకుండా చేర్చడం",
				summary: "సాధారణ గమనిక: జీవించి ఉన్న వ్యక్తుల గురించి మూలాల్లేని వివాదాస్పద సమాచారాన్ని చేర్చడం"
			},
			"uw-defam1": {
				label: "పరువు నష్టం కలిగించే కంటెంటును చేర్చడం",
				summary: "సాధారణ గమనిక: పరువు నష్టం కలిగించే కంటెంటును చేర్చడం"
			},
			"uw-uncen1": {
				label: "సమాచారాన్ని సెన్సారు చెయ్యడం",
				summary: "సాధారణ గమనిక: సమాచారాన్ని సెన్సారు చెయ్యడం"
			},
			"uw-mos1": {
				label: "శైలి",
				summary: "సాధారణ గమనిక: ఫార్మాటింగు, తేదీ, భాష మొదలైనవి (శైలి)"
			},
			"uw-move1": {
				label: "నామకరణ విధానాలకూ, ఏకాభిప్రాయానికీ వ్యతిరేకంగా పేజీల తరలింపులు",
				summary: "సాధారణ గమనిక: నామకరణ విధానాలకూ, ఏకాభిప్రాయానికీ వ్యతిరేకంగా పేజీల తరలింపులు"
			},
			"uw-chat1": {
				label: "చర్చ పేజీని చర్చావేదిక లాగా వాడడం",
				summary: "సాధారణ గమనిక: చర్చ పేజీని చర్చావేదిక లాగా వాడడం"
			},
			"uw-tpv1": {
				label: "చర్చ పేజీల్లో ఇతరుల వాఖ్యలను తిరగరాయడం, సర్దడం, సవరించడం వగైరా (రిఫ్యాక్టరింగు)",
				summary: "సాధారణ గమనిక: చర్చ పేజీల్లో ఇతరుల వాఖ్యలను తిరగరాయడం, సర్దడం, సవరించడం వగైరా (రిఫ్యాక్టరింగు)"
			},
			"uw-afd1": {
				label: "{{afd}} మూసలను తీసెయ్యడం",
				summary: "సాధారణ గమనిక: {{afd}} మూసలను తీసెయ్యడం"
			},
			"uw-speedy1": {
				label: "{{speedy deletion}} మూసలను తీసెయ్యడం",
				summary: "సాధారణ గమనిక: {{speedy deletion}} మూసలను తీసెయ్యడం"
			},
			"uw-blpprod1": {
				label: "{{blp prod}} మూసలను తీసెయ్యడం",
				summary: "సాధారణ గమనిక: {{blp prod}} మూసలను తీసెయ్యడం"
			},
			"uw-npa1": {
				label: "నిర్దుష్ట వాడుకరిని గురిగా చేసుకుని వ్యక్తిగత దాడి",
				summary: "సాధారణ గమనిక: నిర్దుష్ట వాడుకరిని గురిగా చేసుకుని వ్యక్తిగత దాడి"
			},
			"uw-agf1": {
				label: "సదుద్దేశంగా భావించకపోవడం",
				summary: "సాధారణ గమనిక: సదుద్దేశంగా భావించకపోవడం"
			},
			"uw-af1": {
				label: "వ్యాసపు ఫీడ్‌బ్యాక్ పరికరం ద్వారా అనుచితమైన ఫీడ్‌బ్యాక్",
				summary: "సాధారణ గమనిక: వ్యాసపు ఫీడ్‌బ్యాక్ పరికరం ద్వారా అనుచితమైన ఫీడ్‌బ్యాక్"
			},
			"uw-own1": {
				label: "వ్యాసాల స్వామిత్వం",
				summary: "సాధారణ గమనిక: వ్యాసాల స్వామిత్వం"
			},
			"uw-tempabuse1": {
				label: "హెచ్చరిక/నిరోధాల మూసలను అనుచితంగా వాడడం",
				summary: "సాధారణ గమనిక: హెచ్చరిక/నిరోధాల మూసలను అనుచితంగా వాడడం"
			},
			"uw-genre1": {
				label: "ఏకాభిప్రాయం గాని, మూలాలూ గానీ లేకుండా తరచుగా గాని, మూకుమ్మడిగా గానీ జాన్రాలకు చేసే దిద్దుబాట్లు",
				summary: "సాధారణ గమనిక: ఏకాభిప్రాయం గాని, మూలాలూ గానీ లేకుండా తరచుగా గాని, మూకుమ్మడిగా గానీ జాన్రాలకు చేసే దిద్దుబాట్లు"
			}
		},
		level2: {
			"uw-vandalism2": {
				label: "దుశ్చర్య",
				summary: "జాగ్రత్త: దుశ్చర్య"
			},
			"uw-test2": {
				label: "పరీక్షాత్మక దిద్దుబాట్లు",
				summary: "జాగ్రత్త: పరీక్షాత్మక దిద్దుబాట్లు"
			},
			"uw-delete2": {
				label: "కంటెంటు తీసివేత, తుడిచివేత",
				summary: "జాగ్రత్త: కంటెంటు తీసివేత, తుడిచివేత"
			},
			"uw-redirect2": {
				label: "దుర్భావనతో దారిమార్పులు సృష్టించడం",
				summary: "జాగ్రత్త: దుర్భావనతో దారిమార్పులు సృష్టించడం"
			},
			"uw-tdel2": {
				label: "నిర్వహణ మూసలను తీసెయ్యడం",
				summary: "జాగ్రత్త: నిర్వహణ మూసలను తీసెయ్యడం"
			},
			"uw-joke2": {
				label: "అనుచిత హాస్యాన్ని వాడడం ",
				summary: "జాగ్రత్త: అనుచిత హాస్యాన్ని వాడడం "
			},
			"uw-create2": {
				label: "అనుచిత పేజీలను సృష్టించడం",
				summary: "జాగ్రత్త: అనుచిత పేజీలను సృష్టించడం"
			},
			"uw-upload2": {
				label: "విజ్ఞాన సర్వస్వ యోగ్యం కాని బొమ్మలను ఎక్కించడం",
				summary: "జాగ్రత్త: విజ్ఞాన సర్వస్వ యోగ్యం కాని బొమ్మలను ఎక్కించడం"
			},
			"uw-image2": {
				label: "బొమ్మల సంబంధ దుశ్చర్య",
				summary: "జాగ్రత్త: బొమ్మల సంబంధ దుశ్చర్య"
			},
			"uw-ics2": {
				label: "కాపీహక్కుల స్థితి లేకుండా పేజీలను ఎక్కించడం",
				summary: "జాగ్రత్త: కాపీహక్కుల స్థితి లేకుండా పేజీలను ఎక్కించడం"
			},
			"uw-idt2": {
				label: "దస్త్రం తొలగింపు ట్యాగులను తీసెయ్యడం",
				summary: "జాగ్రత్త: దస్త్రం తొలగింపు ట్యాగులను తీసెయ్యడం"
			},
			"uw-spam2": {
				label: "స్పాము లింకులను చేర్చడం",
				summary: "జాగ్రత్త: స్పాము లింకులను చేర్చడం"
			},
			"uw-advert2": {
				label: "వికీపీడియాను వాపార ప్రకటనలకూ, ప్రచారానికీ వాడుకోవడం",
				summary: "జాగ్రత్త: వికీపీడియాను వాపార ప్రకటనలకూ, ప్రచారానికీ వాడుకోవడం"
			},
			"uw-npov2": {
				label: "నిష్పాక్షిక దృక్కోణానికి కట్టుబడక పోవడం",
				summary: "జాగ్రత్త: నిష్పాక్షిక దృక్కోణానికి కట్టుబడక పోవడం"
			},
			"uw-unsourced2": {
				label: "మూలాల్లేని లేదా సరిగా ఉల్లేఖించని కంటెంటును చేర్చడం",
				summary: "జాగ్రత్త: మూలాల్లేని లేదా సరిగా ఉల్లేఖించని కంటెంటును చేర్చడం"
			},
			"uw-error2": {
				label: "కావాలని తప్పుడు వాస్తవాలను చేర్చడం",
				summary: "జాగ్రత్త: తప్పుడు వాస్తవాలను చేర్చడం"
			},
			"uw-nor2": {
				label: "మౌలిక పరిశోధనను - మూలంలోని మేటీరియలు యొక్క సంక్షిప్త రూపమైనా సరే - చేర్చడం ",
				summary: "జాగ్రత్త: మౌలిక పరిశోధనను - మూలంలోని మేటీరియలు యొక్క సంక్షిప్త రూపమైనా సరే - చేర్చడం "
			},
			"uw-biog2": {
				label: "జీవించి ఉన్న వ్యక్తులకు సంబంధించి వివాదాస్పద సమాచారాన్ని మూలాల్లేకుండా చేర్చడం",
				summary: "జాగ్రత్త: జీవించి ఉన్న వ్యక్తులకు సంబంధించి వివాదాస్పద సమాచారాన్ని మూలాల్లేకుండా చేర్చడం"
			},
			"uw-defam2": {
				label: "పరువు నష్టం కలిగించే కంటెంటును చేర్చడం",
				summary: "జాగ్రత్త: పరువు నష్టం కలిగించే కంటెంటును చేర్చడం"
			},
			"uw-uncen2": {
				label: "సమాచారాన్ని సెన్సారు చెయ్యడం",
				summary: "జాగ్రత్త: సమాచారాన్ని సెన్సారు చెయ్యడం"
			},
			"uw-mos2": {
				label: "శైలి",
				summary: "జాగ్రత్త: ఫార్మాటింగు, తేదీ, భాష మొదలైనవి (శైలి)"
			},
			"uw-move2": {
				label: "నామకరణ విధానాలకూ, ఏకాభిప్రాయానికీ వ్యతిరేకంగా పేజీల తరలింపులు",
				summary: "జాగ్రత్త: నామకరణ విధానాలకూ, ఏకాభిప్రాయానికీ వ్యతిరేకంగా పేజీల తరలింపులు"
			},
			"uw-chat2": {
				label: "చర్చ పేజీని చర్చావేదిక లాగా వాడడం",
				summary: "జాగ్రత్త: చర్చ పేజీని చర్చావేదిక లాగా వాడడం"
			},
			"uw-tpv2": {
				label: "చర్చ పేజీల్లో ఇతరుల వాఖ్యలను తిరగరాయడం, సర్దడం, సవరించడం వగైరా (రిఫ్యాక్టరింగు)",
				summary: "జాగ్రత్త: చర్చ పేజీల్లో ఇతరుల వాఖ్యలను తిరగరాయడం, సర్దడం, సవరించడం వగైరా (రిఫ్యాక్టరింగు)"
			},
			"uw-afd2": {
				label: "{{afd}} మూసలను తీసెయ్యడం",
				summary: "జాగ్రత్త: {{afd}} మూసలను తీసెయ్యడం"
			},
			"uw-speedy2": {
				label: "{{speedy deletion}} మూసలను తీసెయ్యడం",
				summary: "జాగ్రత్త: {{speedy deletion}} మూసలను తీసెయ్యడం"
			},
			"uw-blpprod2": {
				label: "{{blp prod}} మూసలను తీసెయ్యడం",
				summary: "జాగ్రత్త: {{blp prod}} మూసలను తీసెయ్యడం"
			},
			"uw-npa2": {
				label: "నిర్దుష్ట వాడుకరిని గురిగా చేసుకుని వ్యక్తిగత దాడి",
				summary: "జాగ్రత్త: నిర్దుష్ట వాడుకరిని గురిగా చేసుకుని వ్యక్తిగత దాడి"
			},
			"uw-agf2": {
				label: "సదుద్దేశంగా భావించకపోవడం",
				summary: "జాగ్రత్త: సదుద్దేశంగా భావించకపోవడం"
			},
			"uw-af2": {
				label: "వ్యాసపు ఫీడ్‌బ్యాక్ పరికరం ద్వారా అనుచితమైన ఫీడ్‌బ్యాక్",
				summary: "జాగ్రత్త: వ్యాసపు ఫీడ్‌బ్యాక్ పరికరం ద్వారా అనుచితమైన ఫీడ్‌బ్యాక్"
			},
			"uw-own2": {
				label: "వ్యాసాల స్వామిత్వం",
				summary: "జాగ్రత్త: వ్యాసాల స్వామిత్వం"
			},
			"uw-tempabuse2": {
				label: "హెచ్చరిక/నిరోధాల మూసలను అనుచితంగా వాడడం",
				summary: "జాగ్రత్త: హెచ్చరిక/నిరోధాల మూసలను అనుచితంగా వాడడం"
			},
			"uw-genre2": {
				label: "ఏకాభిప్రాయం గాని, మూలాలూ గానీ లేకుండా తరచుగా గాని, మూకుమ్మడిగా గానీ జాన్రాలకు చేసే దిద్దుబాట్లు",
				summary: "జాగ్రత్త: ఏకాభిప్రాయం గాని, మూలాలూ గానీ లేకుండా తరచుగా గాని, మూకుమ్మడిగా గానీ జాన్రాలకు చేసే దిద్దుబాట్లు"
			}
		},
		level3: {
			"uw-vandalism3": {
				label: "దుశ్చర్య",
				summary: "హెచ్చరిక: దుశ్చర్య"
			},
			"uw-test3": {
				label: "పరీక్షాత్మక దిద్దుబాట్లు",
				summary: "హెచ్చరిక: పరీక్షాత్మక దిద్దుబాట్లు"
			},
			"uw-delete3": {
				label: "కంటెంటు తీసివేత, తుడిచివేత",
				summary: "హెచ్చరిక: కంటెంటు తీసివేత, తుడిచివేత"
			},
			"uw-redirect3": {
				label: "దుర్భావనతో దారిమార్పులు సృష్టించడం",
				summary: "హెచ్చరిక: దుర్భావనతో దారిమార్పులు సృష్టించడం"
			},
			"uw-tdel3": {
				label: "నిర్వహణ మూసలను తీసెయ్యడం",
				summary: "హెచ్చరిక: నిర్వహణ మూసలను తీసెయ్యడం"
			},
			"uw-joke3": {
				label: "అనుచిత హాస్యాన్ని వాడడం ",
				summary: "హెచ్చరిక: అనుచిత హాస్యాన్ని వాడడం "
			},
			"uw-create3": {
				label: "అనుచిత పేజీలను సృష్టించడం",
				summary: "హెచ్చరిక: అనుచిత పేజీలను సృష్టించడం"
			},
			"uw-upload3": {
				label: "విజ్ఞాన సర్వస్వ యోగ్యం కాని బొమ్మలను ఎక్కించడం",
				summary: "హెచ్చరిక: విజ్ఞాన సర్వస్వ యోగ్యం కాని బొమ్మలను ఎక్కించడం"
			},
			"uw-image3": {
				label: "బొమ్మల సంబంధ దుశ్చర్య",
				summary: "హెచ్చరిక: బొమ్మల సంబంధ దుశ్చర్య"
			},
			"uw-ics3": {
				label: "కాపీహక్కుల స్థితి లేకుండా పేజీలను ఎక్కించడం",
				summary: "హెచ్చరిక: కాపీహక్కుల స్థితి లేకుండా పేజీలను ఎక్కించడం"
			},
			"uw-idt3": {
				label: "దస్త్రం తొలగింపు ట్యాగులను తీసెయ్యడం",
				summary: "హెచ్చరిక: దస్త్రం తొలగింపు ట్యాగులను తీసెయ్యడం"
			},
			"uw-spam3": {
				label: "స్పాము లింకులను చేర్చడం",
				summary: "హెచ్చరిక: స్పాము లింకులను చేర్చడం"
			},
			"uw-advert3": {
				label: "వికీపీడియాను వాపార ప్రకటనలకూ, ప్రచారానికీ వాడుకోవడం",
				summary: "హెచ్చరిక: వికీపీడియాను వాపార ప్రకటనలకూ, ప్రచారానికీ వాడుకోవడం"
			},
			"uw-npov3": {
				label: "నిష్పాక్షిక దృక్కోణానికి కట్టుబడక పోవడం",
				summary: "హెచ్చరిక: నిష్పాక్షిక దృక్కోణానికి కట్టుబడక పోవడం"
			},
			"uw-unsourced3": {
				label: "మూలాల్లేని లేదా సరిగా ఉల్లేఖించని కంటెంటును చేర్చడం",
				summary: "హెచ్చరిక: మూలాల్లేని లేదా సరిగా ఉల్లేఖించని కంటెంటును చేర్చడం"
			},
			"uw-error3": {
				label: "కావాలని తప్పుడు వాస్తవాలను చేర్చడం",
				summary: "హెచ్చరిక: కావాలని తప్పుడు వాస్తవాలను చేర్చడం"
			},
			"uw-nor3": {
				label: "మౌలిక పరిశోధనను - మూలంలోని మేటీరియలు యొక్క సంక్షిప్త రూపమైనా సరే - చేర్చడం ",
				summary: "హెచ్చరిక: మౌలిక పరిశోధనను - మూలంలోని మేటీరియలు యొక్క సంక్షిప్త రూపమైనా సరే - చేర్చడం "
			},
			"uw-biog3": {
				label: "జీవించి ఉన్న వ్యక్తుల గురించి మూలాల్లేని వివాదాస్పదమైన లేదా పరువు నష్టం కలిగించే సమాచారాన్ని చేర్చడం",
				summary: "హెచ్చరిక: జీవించి ఉన్న వ్యక్తుల గురించి మూలాల్లేని వివాదాస్పద సమాచారాన్ని చేర్చడం"
			},
			"uw-defam3": {
				label: "పరువు నష్టం కలిగించే కంటెంటును చేర్చడం",
				summary: "హెచ్చరిక: పరువు నష్టం కలిగించే కంటెంటును చేర్చడం"
			},
			"uw-uncen3": {
				label: "సమాచారాన్ని సెన్సారు చెయ్యడం",
				summary: "హెచ్చరిక: సమాచారాన్ని సెన్సారు చెయ్యడం"
			},
			"uw-mos3": {
				label: "శైలి",
				summary: "హెచ్చరిక: ఫార్మాటింగు, తేదీ, భాష మొదలైనవి (శైలి)"
			},
			"uw-move3": {
				label: "నామకరణ విధానాలకూ, ఏకాభిప్రాయానికీ వ్యతిరేకంగా పేజీల తరలింపులు",
				summary: "హెచ్చరిక: నామకరణ విధానాలకూ, ఏకాభిప్రాయానికీ వ్యతిరేకంగా పేజీల తరలింపులు"
			},
			"uw-chat3": {
				label: "చర్చ పేజీని చర్చావేదిక లాగా వాడడం",
				summary: "హెచ్చరిక: చర్చ పేజీని చర్చావేదిక లాగా వాడడం"
			},
			"uw-tpv3": {
				label: "చర్చ పేజీల్లో ఇతరుల వాఖ్యలను తిరగరాయడం, సర్దడం, సవరించడం వగైరా (రిఫ్యాక్టరింగు)",
				summary: "హెచ్చరిక: చర్చ పేజీల్లో ఇతరుల వాఖ్యలను తిరగరాయడం, సర్దడం, సవరించడం వగైరా (రిఫ్యాక్టరింగు)"
			},
			"uw-afd3": {
				label: "{{afd}} మూసలను తీసెయ్యడం",
				summary: "హెచ్చరిక: {{afd}} మూసలను తీసెయ్యడం"
			},
			"uw-speedy3": {
				label: "{{speedy deletion}} మూసలను తీసెయ్యడం",
				summary: "హెచ్చరిక: {{speedy deletion}} మూసలను తీసెయ్యడం"
			},
			"uw-blpprod3": {
				label: "{{blpprod}} మూసలను తీసెయ్యడం",
				summary: "హెచ్చరిక: {{blpprod}} మూసలను తీసెయ్యడం"
			},
			"uw-npa3": {
				label: "నిర్దుష్ట వాడుకరిని గురిగా చేసుకుని వ్యక్తిగత దాడి",
				summary: "హెచ్చరిక: నిర్దుష్ట వాడుకరిని గురిగా చేసుకుని వ్యక్తిగత దాడి"
			},
			"uw-agf3": {
				label: "సదుద్దేశంగా భావించకపోవడం",
				summary: "హెచ్చరిక: సదుద్దేశంగా భావించకపోవడం"
			},
			"uw-af3": {
				label: "వ్యాసపు ఫీడ్‌బ్యాక్ పరికరం ద్వారా అనుచితమైన ఫీడ్‌బ్యాక్",
				summary: "హెచ్చరిక: వ్యాసపు ఫీడ్‌బ్యాక్ పరికరం ద్వారా అనుచితమైన ఫీడ్‌బ్యాక్"
			},
			"uw-own3": {
				label: "వ్యాసాల స్వామిత్వం",
				summary: "హెచ్చరిక: వ్యాసాల స్వామిత్వం"
			},
			"uw-genre3": {
				label: "ఏకాభిప్రాయం గాని, మూలాలూ గానీ లేకుండా తరచుగా గాని, మూకుమ్మడిగా గానీ జాన్రాలకు చేసే దిద్దుబాట్లు",
				summary: "హెచ్చరిక: ఏకాభిప్రాయం గాని, మూలాలూ గానీ లేకుండా తరచుగా గాని, మూకుమ్మడిగా గానీ జాన్రాలకు చేసే దిద్దుబాట్లు"
			}

		},
		level4: {
			"uw-generic4": {
				label: "సాధారణ హెచ్చరిక (4 వ స్థాయిని మిస్సయిన మూసల శ్రేణి)",
				summary: "చివరి హెచ్చరిక నోటీసు"
			},
			"uw-vandalism4": {
				label: "దుశ్చర్య",
				summary: "చివరి హెచ్చరిక: దుశ్చర్య"
			},
			"uw-test4": {
				label: "పరీక్షాత్మక దిద్దుబాట్లు",
				summary: "చివరి హెచ్చరిక: పరీక్షాత్మక దిద్దుబాట్లు"
			},
			"uw-delete4": {
				label: "కంటెంటు తీసివేత, తుడిచివేత",
				summary: "చివరి హెచ్చరిక: కంటెంటు తీసివేత, తుడిచివేత"
			},
			"uw-redirect4": {
				label: "దుర్భావనతో దారిమార్పులు సృష్టించడం",
				summary: "చివరి హెచ్చరిక: దుర్భావనతో దారిమార్పులు సృష్టించడం"
			},
			"uw-tdel4": {
				label: "నిర్వహణ మూసలను తీసెయ్యడం",
				summary: "చివరి హెచ్చరిక: నిర్వహణ మూసలను తీసెయ్యడం"
			},
			"uw-joke4": {
				label: "అనుచిత హాస్యాన్ని వాడడం ",
				summary: "చివరి హెచ్చరిక: అనుచిత హాస్యాన్ని వాడడం "
			},
			"uw-create4": {
				label: "అనుచిత పేజీలను సృష్టించడం",
				summary: "చివరి హెచ్చరిక: అనుచిత పేజీలను సృష్టించడం"
			},
			"uw-upload4": {
				label: "విజ్ఞాన సర్వస్వ యోగ్యం కాని బొమ్మలను ఎక్కించడం",
				summary: "చివరి హెచ్చరిక: విజ్ఞాన సర్వస్వ యోగ్యం కాని బొమ్మలను ఎక్కించడం"
			},
			"uw-image4": {
				label: "బొమ్మల సంబంధ దుశ్చర్య",
				summary: "చివరి హెచ్చరిక: బొమ్మల సంబంధ దుశ్చర్య"
			},
			"uw-ics4": {
				label: "కాపీహక్కుల స్థితి లేకుండా పేజీలను ఎక్కించడం",
				summary: "చివరి హెచ్చరిక: కాపీహక్కుల స్థితి లేకుండా పేజీలను ఎక్కించడం"
			},
			"uw-idt4": {
				label: "దస్త్రం తొలగింపు ట్యాగులను తీసెయ్యడం",
				summary: "చివరి హెచ్చరిక: దస్త్రం తొలగింపు ట్యాగులను తీసెయ్యడం"
			},
			"uw-spam4": {
				label: "స్పాము లింకులను చేర్చడం",
				summary: "చివరి హెచ్చరిక: స్పాము లింకులను చేర్చడం"
			},
			"uw-advert4": {
				label: "వికీపీడియాను వాపార ప్రకటనలకూ, ప్రచారానికీ వాడుకోవడం",
				summary: "చివరి హెచ్చరిక: వికీపీడియాను వాపార ప్రకటనలకూ, ప్రచారానికీ వాడుకోవడం"
			},
			"uw-npov4": {
				label: "నిష్పాక్షిక దృక్కోణానికి కట్టుబడక పోవడం",
				summary: "చివరి హెచ్చరిక: నిష్పాక్షిక దృక్కోణానికి కట్టుబడక పోవడం"
			},
			"uw-unsourced4": {
				label: "మూలాల్లేని లేదా సరిగా ఉల్లేఖించని కంటెంటును చేర్చడం",
				summary: "చివరి హెచ్చరిక: మూలాల్లేని లేదా సరిగా ఉల్లేఖించని కంటెంటును చేర్చడం"
			},
			"uw-error4": {
				label: "కావాలని తప్పుడు వాస్తవాలను చేర్చడం",
				summary: "చివరి హెచ్చరిక: కావాలని తప్పుడు వాస్తవాలను చేర్చడం"
			},
			"uw-nor4": {
				label: "మౌలిక పరిశోధనను - మూలంలోని మేటీరియలు యొక్క సంక్షిప్త రూపమైనా సరే - చేర్చడం ",
				summary: "చివరి హెచ్చరిక: మౌలిక పరిశోధనను - మూలంలోని మేటీరియలు యొక్క సంక్షిప్త రూపమైనా సరే - చేర్చడం "
			},
			"uw-biog4": {
				label: "జీవించి ఉన్న వ్యక్తుల గురించి పరువు నష్టం కలిగించే మూలాల్లేని సమాచారాన్ని చేర్చడం",
				summary: "చివరి హెచ్చరిక: జీవించి ఉన్న వ్యక్తుల గురించి మూలాల్లేని వివాదాస్పద సమాచారాన్ని చేర్చడం"
			},
			"uw-defam4": {
				label: "పరువు నష్టం కలిగించే కంటెంటును చేర్చడం",
				summary: "చివరి హెచ్చరిక: పరువు నష్టం కలిగించే కంటెంటును చేర్చడం"
			},
			"uw-uncen4": {
				label: "సమాచారాన్ని సెన్సారు చెయ్యడం",
				summary: "చివరి హెచ్చరిక: సమాచారాన్ని సెన్సారు చెయ్యడం"
			},
			"uw-mos4": {
				label: "శైలి",
				summary: "చివరి హెచ్చరిక: ఫార్మాటింగు, తేదీ, భాష మొదలైనవి (శైలి)"
			},
			"uw-move4": {
				label: "నామకరణ విధానాలకూ, ఏకాభిప్రాయానికీ వ్యతిరేకంగా పేజీల తరలింపులు",
				summary: "చివరి హెచ్చరిక: నామకరణ విధానాలకూ, ఏకాభిప్రాయానికీ వ్యతిరేకంగా పేజీల తరలింపులు"
			},
			"uw-chat4": {
				label: "చర్చ పేజీని చర్చావేదిక లాగా వాడడం",
				summary: "చివరి హెచ్చరిక: చర్చ పేజీని చర్చావేదిక లాగా వాడడం"
			},
			"uw-tpv4": {
				label: "చర్చ పేజీల్లో ఇతరుల వాఖ్యలను తిరగరాయడం, సర్దడం, సవరించడం వగైరా (రిఫ్యాక్టరింగు)",
				summary: "చివరి హెచ్చరిక: చర్చ పేజీల్లో ఇతరుల వాఖ్యలను తిరగరాయడం, సర్దడం, సవరించడం వగైరా (రిఫ్యాక్టరింగు)"
			},
			"uw-afd4": {
				label: "{{afd}} మూసలను తీసెయ్యడం",
				summary: "చివరి హెచ్చరిక: {{afd}} మూసలను తీసెయ్యడం"
			},
			"uw-speedy4": {
				label: "{{speedy deletion}} మూసలను తీసెయ్యడం",
				summary: "చివరి హెచ్చరిక: {{speedy deletion}} మూసలను తీసెయ్యడం"
			},
			"uw-blpprod4": {
				label: "{{blpprod}} మూసలను తీసెయ్యడం",
				summary: "చివరి హెచ్చరిక: {{blpprod}} మూసలను తీసెయ్యడం"
			},
			"uw-npa4": {
				label: "నిర్దుష్ట వాడుకరిని గురిగా చేసుకుని వ్యక్తిగత దాడి",
				summary: "చివరి హెచ్చరిక: నిర్దుష్ట వాడుకరిని గురిగా చేసుకుని వ్యక్తిగత దాడి"
			},
			"uw-af4": {
				label: "వ్యాసపు ఫీడ్‌బ్యాక్ పరికరం ద్వారా అనుచితమైన ఫీడ్‌బ్యాక్",
				summary: "చివరి హెచ్చరిక: వ్యాసపు ఫీడ్‌బ్యాక్ పరికరం ద్వారా అనుచితమైన ఫీడ్‌బ్యాక్"
			}

		},
		level4im: {
			"uw-vandalism4im": {
				label: "దుశ్చర్య",
				summary: "ఏకైక హెచ్చరిక: దుశ్చర్య"
			},
			"uw-delete4im": {
				label: "కంటెంటు తీసివేత, తుడిచివేత",
				summary: "ఏకైక హెచ్చరిక: కంటెంటు తీసివేత, తుడిచివేత"
			},
			"uw-redirect4im": {
				label: "దుర్భావనతో దారిమార్పులు సృష్టించడం",
				summary: "ఏకైక హెచ్చరిక: దుర్భావనతో దారిమార్పులు సృష్టించడం"
			},
			"uw-joke4im": {
				label: "అనుచిత హాస్యాన్ని వాడడం ",
				summary: "ఏకైక హెచ్చరిక: అనుచిత హాస్యాన్ని వాడడం "
			},
			"uw-create4im": {
				label: "అనుచిత పేజీలను సృష్టించడం",
				summary: "ఏకైక హెచ్చరిక: అనుచిత పేజీలను సృష్టించడం"
			},
			"uw-upload4im": {
				label: "విజ్ఞాన సర్వస్వ యోగ్యం కాని బొమ్మలను ఎక్కించడం",
				summary: "ఏకైక హెచ్చరిక: విజ్ఞాన సర్వస్వ యోగ్యం కాని బొమ్మలను ఎక్కించడం"
			},
			"uw-image4im": {
				label: "బొమ్మల సంబంధ దుశ్చర్య",
				summary: "ఏకైక హెచ్చరిక: బొమ్మల సంబంధ దుశ్చర్య"
			},
			"uw-spam4im": {
				label: "స్పాము లింకులను చేర్చడం",
				summary: "ఏకైక హెచ్చరిక: స్పాము లింకులను చేర్చడం"
			},
			"uw-advert4im": {
				label: "వికీపీడియాను వాపార ప్రకటనలకూ, ప్రచారానికీ వాడుకోవడం",
				summary: "ఏకైక హెచ్చరిక: వికీపీడియాను వాపార ప్రకటనలకూ, ప్రచారానికీ వాడుకోవడం"
			},
			"uw-biog4im": {
				label: "జీవించి ఉన్న వ్యక్తుల గురించి పరువు నష్టం కలిగించే మూలాల్లేని సమాచారాన్ని చేర్చడం",
				summary: "ఏకైక హెచ్చరిక: జీవించి ఉన్న వ్యక్తుల గురించి మూలాల్లేని వివాదాస్పద సమాచారాన్ని చేర్చడం"
			},
			"uw-defam4im": {
				label: "పరువు నష్టం కలిగించే కంటెంటును చేర్చడం",
				summary: "ఏకైక హెచ్చరిక: పరువు నష్టం కలిగించే కంటెంటును చేర్చడం"
			},
			"uw-move4im": {
				label: "నామకరణ విధానాలకూ, ఏకాభిప్రాయానికీ వ్యతిరేకంగా పేజీల తరలింపులు",
				summary: "ఏకైక హెచ్చరిక: నామకరణ విధానాలకూ, ఏకాభిప్రాయానికీ వ్యతిరేకంగా పేజీల తరలింపులు"
			},
			"uw-npa4im": {
				label: "నిర్దుష్ట వాడుకరిని గురిగా చేసుకుని వ్యక్తిగత దాడి",
				summary: "ఏకైక హెచ్చరిక: నిర్దుష్ట వాడుకరిని గురిగా చేసుకుని వ్యక్తిగత దాడి"
			},
			"uw-af4im": {
				label: "వ్యాసపు ఫీడ్‌బ్యాక్ పరికరం ద్వారా అనుచితమైన ఫీడ్‌బ్యాక్",
				summary: "ఏకైక హెచ్చరిక: వ్యాసపు ఫీడ్‌బ్యాక్ పరికరం ద్వారా అనుచితమైన ఫీడ్‌బ్యాక్"
			}
		},
		singlenotice: {
			"uw-2redirect": {
				label: "తప్పు తరలింపులు చేసి జమిలి దారిమార్పులను సృష్టించడం",
				summary: "నోటీసు: తప్పు తరలింపులు చేసి జమిలి దారిమార్పులను సృష్టించడం"
			},
			"uw-af-contact": {
				label: "వ్యాసపు ఫీడ్‌బ్యాక్ ద్వారా వ్యాస విషయాన్ని సంప్రదించే ప్రయత్నం చెయ్యడం",
				summary: "నోటీసు: వ్యాసపు ఫీడ్‌బ్యాక్ ద్వారా వ్యాస విషయాన్ని సంప్రదించడం"
			},
			"uw-af-personalinfo": {
				label: "వ్యాసపు ఫీడ్‌బ్యాక్‌లో వ్యక్తిగత సమాచారం ఇవ్వడం",
				summary: "నోటీసు: వ్యాసపు ఫీడ్‌బ్యాక్‌లో వ్యక్తిగత సమాచారం ఇవ్వడం"
			},
			"uw-af-question": {
				label: "వ్యాసపు ఫీడ్‌బ్యాక్‌లో ప్రశ్నలు అడగడం",
				summary: "నోటీసు: వ్యాసపు ఫీడ్‌బ్యాక్‌లో ప్రశ్నలు అడగడం"
			},
			"uw-aiv": {
				label: "చెడ్డ AIV ఫిర్యాదు",
				summary: "నోటీసు: చెడ్డ AIV ఫిర్యాదు"
			},
			"uw-articlesig": {
				label: "వ్యాసాల్లో సంతకం చెయ్యడం",
				summary: "నోటీసు: వ్యాసాల్లో సంతకం చెయ్యడం"
			},
			"uw-autobiography": {
				label: "స్వీయచరిత్రలు రాసుకోవడం",
				summary: "నోటీసు: స్వీయచరిత్రలు రాసుకోవడం"
			},
			"uw-badcat": {
				label: "తప్పు వర్గాలను సృష్టించడం",
				summary: "నోటీసు: తప్పు వర్గాలను సృష్టించడం"
			},
			"uw-badlistentry": {
				label: "జాబితాల్లో సముచితం కాని ఎంట్రీలను చేర్చడం",
				summary: "నోటీసు: జాబితాల్లో సముచితం కాని ఎంట్రీలను చేర్చడం"
			},
			"uw-bite": {
				label: "కొత్తవాళ్లను \"కరవడం\"",
				summary: "నోటీసు: కొత్తవాళ్లను \"కరవడం\""
			},
			"uw-coi": {
				label: "అన్యథా ఆసక్తి కలిగి ఉండడం",
				summary: "నోటీసు: అన్యథా ఆసక్తి కలిగి ఉండడం"
			},
			"uw-controversial": {
				label: "వివాదాస్పద కంటెంటును చేర్చడం",
				summary: "నోటీసు: వివాదాస్పద కంటెంటును చేర్చడం"
			},
			"uw-copying": {
				label: "పాఠ్యాన్ని మరో పేజీలోకి కాపీ చెయ్యడం",
				summary: "నోటీసు: పాఠ్యాన్ని మరో పేజీలోకి కాపీ చెయ్యడం"
			},
			"uw-crystal": {
				label: "ఊహాత్మక, నిర్ధారణ కాని సమాచారాన్ని చేర్చడం",
				summary: "నోటీసు: ఊహాత్మక, నిర్ధారణ కాని సమాచారాన్ని చేర్చడం"
			},
			"uw-csd": {
				label: "సత్వర తొలగింపు తిరస్కరణ",
				summary: "నోటీసు: సత్వర తొలగింపు తిరస్కరణ"
			},
			"uw-c&pmove": {
				label: "కట్-పేస్టు తరలింపులు",
				summary: "నోటీసు: కట్-పేస్టు తరలింపులు"
			},
			"uw-dab": {
				label: "అయోమయ నివృత్తి పేజీలో తప్పు దిద్దుబాటు",
				summary: "నోటీసు: అయోమయ నివృత్తి పేజీలో తప్పు దిద్దుబాటు"
			},
			"uw-date": {
				label: "అనవసరంగా తేదీ ఆకృతులను మార్చడం",
				summary: "నోటీసు: అనవసరంగా తేదీ ఆకృతులను మార్చడం"
			},
			"uw-deadlink": {
				label: "డెడ్ లింకులున్న సరైన మూలాలను తీసేయడం",
				summary: "నోటీసు: డెడ్ లింకులున్న సరైన మూలాలను తీసేయడం"
			},
			"uw-directcat": {
				label: "మొలక వర్గాలను మానవికంగా చేర్చడం",
				summary: "నోటీసు: మొలక వర్గాలను మానవికంగా చేర్చడం"
			},
			"uw-draftfirst": {
				label: "సత్వర తొలగింపు జరగకుండా ఉండేందుకు గాను, వాడుకరి తన వాడుకరిపేజీ ఉపపేజీల్లో రాయాలి",
				summary: "నోటీసు: వ్యాసాన్ని మీ వాడుకరిపేజీకి ఉపపేజీగా సృష్టించండి"
			},
			"uw-editsummary": {
				label: "దిద్దుబాటు సారాంశం రాయకపోవడం",
				summary: "నోటీసు: దిద్దుబాటు సారాంశం రాయకపోవడం"
			},
			"uw-english": {
				label: "తెలుగులో రాయడం లేదు",
				summary: "నోటీసు: తెలుగులో రాయడం లేదు"
			},
			"uw-fuir": {
				label: "మీ వాడుకరి పేజీ నుండి సముచిత వినియోగం బొమ్మను తీసేసాం",
				summary: "నోటీసు: మీ వాడుకరి పేజీ నుండి సముచిత వినియోగం బొమ్మను తీసేసాం"
			},
			"uw-hasty": {
				label: "సత్వర తొలగింపు ట్యాగులను తొందరపడి చేర్చడం",
				summary: "నోటీసు: తొలగింపు ట్యాగులు చేర్చేముందు పేజీ సృష్టించిన వారికి వాసాన్ని మెరుగుపరచే సమయం ఇవ్వండి "
			},
			"uw-imageuse": {
				label: "తప్పు బొమ్మ లింకులు",
				summary: "నోటీసు: తప్పు బొమ్మ లింకులు"
			},
			"uw-incompleteAFD": {
				label: "అసంపూర్ణ AFD",
				summary: "నోటీసు: అసంపూర్ణ AFD"
			},
			"uw-italicize": {
				label: "వ్యాసాల్లో వచ్చే పుస్తకాలు, సినిమాలు, ఆల్బములు, పత్రికలు, టీవీ సీరియళ్ళు వగైరాల పేర్లను వాలుగా రాయాలి",
				summary: "నోటీసు: వ్యాసాల్లో వచ్చే పుస్తకాలు, సినిమాలు, ఆల్బములు, పత్రికలు, టీవీ సీరియళ్ళు వగైరాల పేర్లను వాలుగా రాయాలి"
			},
		//	"uw-lang": {
		//		label: "Unnecessarily changing between British and American English",
		//		summary: "నోటీసు: Unnecessarily changing between British and American English"
		//	},
			"uw-linking": {
				label: "అతిగా ఉన్న ఎర్రలింకులు, పునరుక్తమైన నీలం లింకులు",
				summary: "నోటీసు: అతిగా ఉన్న ఎర్రలింకులు, పునరుక్తమైన నీలం లింకులు"
			},
			"uw-minor": {
				label: "చిన్న దిద్దుబాటు చెక్‌బాక్సును తప్పుగా వాడడం",
				summary: "నోటీసు: చిన్న దిద్దుబాటు చెక్‌బాక్సును తప్పుగా వాడడంo"
			},
			"uw-nonfree": {
				label: "ప్రత్యామ్నాయం ఉన్నప్పటికీ, ఉచితం-కాని బొమ్మలను ఎక్కించడం",
				summary: "నోటీసు: ప్రత్యామ్నాయం ఉన్నప్పటికీ, ఉచితం-కాని బొమ్మలను ఎక్కించడం"
			},
			"uw-notaiv": {
				label: "స్పష్టంగా లేని దుశ్చర్యను AIV కి నివేదించకండి",
				summary: "నోటీసు: స్పష్టంగా లేని దుశ్చర్యను AIV కి నివేదించకండి"
			},
			"uw-notenglish": {
				label: "తెలుగేతర భాషలో వ్యాసాలను సృష్టించడం",
				summary: "నోటీసు: తెలుగేతర భాషలో వ్యాసాలను సృష్టించడం"
			},
			"uw-notifysd": {
				label: "సత్వర తొలగింపు ట్యాగులు పెట్టిన వ్యాసాల గురించి వాటి కర్తలకు తెలియపరచండి",
				summary: "నోటీసు: సత్వర తొలగింపు ట్యాగులు పెట్టిన వ్యాసాల గురించి వాటి కర్తలకు తెలియపరచండి"
			},
			"uw-notvand": {
				label: "మంచి దిద్దుబాట్లను దుశ్చర్య అని తప్పుగా గుర్తించడం",
				summary: "నోటీసు: మంచి దిద్దుబాట్లను దుశ్చర్య అని తప్పుగా గుర్తించడం"
			},
			"uw-notvote": {
				label: "వికీలో మనం ఏకాభిప్రాయాన్ని వాడతాం, వోటింగును కాదు",
				summary: "నోటీసు: వికీలో మనం ఏకాభిప్రాయాన్ని వాడతాం, వోటింగును కాదు"
			},
			"uw-patrolled": {
				label: "తనిఖీ చేసిన కొత్త పేజీలను తనిఖీ చేసినట్లుగా గుర్తించండి",
				summary: "నోటీసు: తనిఖీ చేసిన కొత్త పేజీలను తనిఖీ చేసినట్లుగా గుర్తించండి"
			},
			"uw-plagiarism": {
				label: "పబ్లిక్ డొమెయిన్ వనరుల నుండి, వారికి శ్రేయస్సును ఆపాదించకుండా, కాపీ చేస్తున్నారు",
				summary: "నోటీసు: పబ్లిక్ డొమెయిన్ వనరుల నుండి, వారికి శ్రేయస్సును ఆపాదించకుండా, కాపీ చేస్తున్నారు"
			},
			"uw-preview": {
				label: "పొరపాట్లను నివారించేందుకు మునుజూపు బొత్తాన్ని వాడండి",
				summary: "నోటీసు: పొరపాట్లను నివారించేందుకు మునుజూపు బొత్తాన్ని వాడండి"
			},
			"uw-probation": {
				label: "వ్యాసం ప్రొబేషనులో ఉంది",
				summary: "నోటీసు: వ్యాసం ప్రొబేషనులో ఉంది"
			},
			"uw-refimprove": {
				label: "నిర్ధారణ చేసుకోలేని వ్యాసాలను సృష్టిస్తున్నారు",
				summary: "నోటీసు: నిర్ధారణ చేసుకోలేని వ్యాసాలను సృష్టిస్తున్నారు"
			},
			"uw-removevandalism": {
				label: "దుశ్చర్య తీసివేత సరిగ్గా జరగలేదు",
				summary: "నోటీసు: దుశ్చర్య తీసివేత సరిగ్గా జరగలేదు"
			},
			"uw-repost": {
				label: "XfD ద్వారా గతంలో తొలగించిన పేజీలను మళ్ళీ సృష్టిస్తున్నారు",
				summary: "నోటీసు: గతంలో తొలగించిన పేజీలను మళ్ళీ సృష్టిస్తున్నారు"
			},
			"uw-salt": {
				label: "సృష్టించకుండా సంరక్షించిన శీర్షిక యొక్క వేరేపేరుతో పేజీని సృష్టించడం",
				summary: "నోటీసు: సృష్టించకుండా సంరక్షించిన శీర్షిక యొక్క వేరేపేరుతో పేజీని సృష్టించడం"
			},
			"uw-samename": {
				label: "సాధ్యం కాని పేరుమార్పు అభ్యర్థన",
				summary: "నోటీసు: సాధ్యం కాని పేరుమార్పు అభ్యర్థన"
			},
			"uw-selfrevert": {
				label: "స్వంత పరీక్షలను వెనక్కి తిప్పడం",
				summary: "నోటీసు: స్వంత పరీక్షలను వెనక్కి తిప్పడం"
			},
			"uw-socialnetwork": {
				label: "వికీపీడియా సామాజిక నెట్‌వర్కేమీ కాదు",
				summary: "నోటీసు: వికీపీడియా సామాజిక నెట్‌వర్కేమీ కాదు"
			},
			"uw-sofixit": {
				label: "వెనకాడకుండా దోషాలను మీరే సవరించండి",
				summary: "నోటీసు: వెనకాడకుండా దోషాలను మీరే సవరించవచ్చు"
			},
			"uw-spoiler": {
				label: "విభాగాల్లో స్పాయిలర్ అలర్టులను చేర్చడం లేదా స్పాయిలరు పాఠ్యాన్ని తీసెయ్యడం",
				summary: "నోటీసు: వ్యాసాల్లోంచి స్పాయిలర్లను తీసెయ్యకండి"
			},
			"uw-subst": {
				label: "మూసలను subst: చెయ్యాలని గుర్తుంచుకోవడం",
				summary: "నోటీసు: మూసలను subst: చెయ్యాలని గుర్తుంచుకోవడం"
			},
			"uw-talkinarticle": {
				label: "వ్యాసంలో చర్చించడం ",
				summary: "నోటీసు: వ్యాసంలో చర్చించడం "
			},
			"uw-tilde": {
				label: "వ్యాఖ్యలపై సంతకం పెట్టకపోవడం",
				summary: "నోటీసు: వ్యాఖ్యలపై సంతకం పెట్టకపోవడం"
			},
			"uw-toppost": {
				label: "చర్చ పేజీల్లో అన్నిటికంటే పైన రాయడం",
				summary: "నోటీసు: చర్చ పేజీల్లో అన్నిటికంటే పైన రాయడం"
			},
			"uw-uaa": {
				label: "వాడుకరిపేరుపై WP:UAA కు చేసిన ఫిర్యాదును వాళ్ళు స్వీకరించలేదు",
				summary: "నోటీసు: వాడుకరిపేరుపై WP:UAA కు చేసిన ఫిర్యాదును వాళ్ళు స్వీకరించలేదు"
			},
			"uw-upincat": {
				label: "అనుకోకుండా వాడుకరి పేజీనో దాని ఉపపేజీలనో కంటెంటు వర్గంలో చేర్చడం ",
				summary: "నోటీసు: వాడుకరికి చెందిన వాడుకరి పేజీయో దాని ఉపపేజీలో కంటెంటు వర్గంలో చేరాయని తెలియజేయడం"
			},
			"uw-uploadfirst": {
				label: "బయటి బొమ్మను పేజీలో చూపించాలనే ప్రయత్నం",
				summary: "నోటీసు: బయటి బొమ్మను పేజీలో చూపించాలనే ప్రయత్నం"
			},
			"uw-userspace draft finish": {
				label: "పాతబడిపోయిన వాడుకరి ఉపపేజీ డ్రాఫ్టు",
				summary: "నోటీసు: పాతబడిపోయిన వాడుకరి ఉపపేజీ డ్రాఫ్టు"
			},
			"uw-userspacenoindex": {
				label: "వాడుకరి పేజీ లేదా ఉపపేజీ సెర్చి ఇంజన్లు ఇండెక్సు చేసేందుకు సముచితంగా లేదు",
				summary: "నోటీసు: వాడుకరి పేజీ లేదా ఉపపేజీ సెర్చి ఇంజన్లు ఇండెక్సు చేసేందుకు సముచితంగా లేదు"
			},
			"uw-vgscope": {
				label: "వీడియోగేముల వాడుక విధానాలు, ఛీట్స్, సూచనలను చేర్చడం",
				summary: "నోటీసు: వీడియోగేముల వాడుక విధానాలు, ఛీట్స్, సూచనలను చేర్చడం"
			},
			"uw-warn": {
				label: "దుశ్చర్యలను తిప్పికొట్టేటపుడు, వాడుకరి హెచ్చరిక మూసలు పెట్టడం",
				summary: "నోటీసు: దుశ్చర్యలను తిప్పికొట్టేటపుడు, వాడుకరి హెచ్చరిక మూసలు పెట్టవచ్చు"
			}
		},
		singlewarn: {
			"uw-3rr": {
				label: "త్రీ-రివర్టు నియమాన్ని ఉల్లంఘిస్తున్నారు; uw-ew కూడా చూడండి",
				summary: "హెచ్చరిక: త్రీ-రివర్టు నియమాన్ని ఉల్లంఘిస్తున్నారు"
			},
			"uw-affiliate": {
				label: "అనుబంధ మార్కెటింగు",
				summary: "హెచ్చరిక: అనుబంధ మార్కెటింగు"
			},
			"uw-agf-sock": {
				label: "అనేక ఖాతాల వాడుక (సదుద్దేశంతోనే చేసారని భావిస్తూ)",
				summary: "హెచ్చరిక: అనేక ఖాతాల వాడుక"
			},
			"uw-attack": {
				label: "దాడి పేజీలను సృష్టించడం",
				summary: "హెచ్చరిక: దాడి పేజీలను సృష్టించడం",
				suppressArticleInSummary: true
			},
			"uw-attempt": {
				label: "దిద్దుబాటు వడపోతను ట్రిగ్గరు చెయ్యడం",
				summary: "హెచ్చరిక: దిద్దుబాటు వడపోతను ట్రిగ్గరు చెయ్యడం"
			},
			"uw-bizlist": {
				label: "వ్యాపార ప్రయోజనాలు",
				summary: "హెచ్చరిక: వ్యాపార ప్రయోజనాలు"
			},
			"uw-botun": {
				label: "బాట్ వాడుకరిపేరు",
				summary: "హెచ్చరిక: బాట్ వాడుకరిపేరు"
			},
			"uw-canvass": {
				label: "క్యాన్‌వాసింగు",
				summary: "హెచ్చరిక: క్యాన్‌వాసింగు"
			},
			"uw-copyright": {
				label: "కాపీహక్కుల ఉల్లంఘన",
				summary: "హెచ్చరిక: కాపీహక్కుల ఉల్లంఘన"
			},
			"uw-copyright-link": {
				label: "కాపీహక్కులు ఉల్లంఘించిన సైట్లకు లింకు ఇవ్వడం",
				summary: "హెచ్చరిక: కాపీహక్కులు ఉల్లంఘించిన సైట్లకు లింకు ఇవ్వడం"
			},
			"uw-copyright-new": {
				label: "కాపీహక్కుల ఉల్లంఘన (కొత్త వాడుకరులకు వివరణతో)",
				summary: "నోటీసు: కాపీహక్కుల సమస్యను నివారించడం"
			},
			"uw-copyright-remove": {
				label: "వ్యాసాల్లోంచి {{copyvio}} మూసను తీసెయ్యడం",
				summary: "హెచ్చరిక: {{copyvio}} మూసను తీసెయ్యడంs"
			},
			"uw-efsummary": {
				label: "దిద్దుబాటు సారాంశం వడపోతను ట్రిగ్గరు చెయ్యడం",
				summary: "హెచ్చరిక: దిద్దుబాటు సారాంశం వడపోతను ట్రిగ్గరు చెయ్యడం"
			},
			"uw-ew": {
				label: "దిద్దుబాటు యుద్ధం (మరింత కఠినమైన మాటలు)",
				summary: "హెచ్చరిక: దిద్దుబాటు యుద్ధం"
			},
			"uw-ewsoft": {
				label: "దిద్దుబాటు యుద్ధం (కొత్తవారి కోసం కొంత మృదువుగా)",
				summary: "హెచ్చరిక: దిద్దుబాటు యుద్ధం"
			},
			"uw-hoax": {
				label: "హోక్సుల సృష్టి",
				summary: "హెచ్చరిక: హోక్సుల సృష్టి"
			},
			"uw-legal": {
				label: "చట్టపరమైన చర్యల బెదిరింపులు",
				summary: "హెచ్చరిక: చట్టపరమైన చర్యల బెదిరింపులు"
			},
			"uw-longterm": {
				label: "దీర్ఘకాలంగా చేస్తున్న దుశ్చర్య సరళి",
				summary: "హెచ్చరిక: దీర్ఘ కాలంగా చేస్తున్న దుశ్చర్య సరళి"
			},
			"uw-multipleIPs": {
				label: "అనేక ఐపీల వాడుక",
				summary: "హెచ్చరిక: అనేక ఐపీల వాడుక"
			},
			"uw-pinfo": {
				label: "వ్యక్తిగత సమాచారం",
				summary: "హెచ్చరిక: వ్యక్తిగత సమాచారం"
			},
			"uw-socksuspect": {
				label: "సాక్‌పపెట్రీ",
				summary: "హెచ్చరిక: మీరొక సాక్‌పపెట్ అని అనుమానం" // of User:...
			},
			"uw-upv": {
				label: "వాడుకరిపేజీ దుశ్చర్య",
				summary: "హెచ్చరిక: వాడుకరిపేజీ దుశ్చర్య"
			},
			"uw-username": {
				label: "వాడుకరిపేరు విధానానికి విరుద్ధంగా ఉంది",
				summary: "హెచ్చరిక: మీ వాడుకరిపేరు, విధానానికి విరుద్ధంగా ఉందనిపిస్తోంది",
				suppressArticleInSummary: true // not relevant for this template
			},
			"uw-coi-username": {
				label: "వాడుకరిపేరు విధానానికి విరుద్ధం. పైగా అన్యథా ఆసక్తి",
				summary: "హెచ్చరిక: వాడుకరిపేరు విధానానికి విరుద్ధం. పైగా అన్యథా ఆసక్తి"
			},
			"uw-userpage": {
				label: "వాడుకరిపేజీ గానీ, దాని ఉపపేజీ గానీ విధానానికి విరుద్ధంగా ఉన్నాయి",
				summary: "హెచ్చరిక: వాడుకరిపేజీ గానీ, దాని ఉపపేజీ గానీ విధానానికి విరుద్ధంగా ఉన్నాయి"
			},
			"uw-wrongsummary": {
				label: "ఖచ్చితంగా లేని లేదా అనుచితమైన దిద్దుబాటు సారాంశాలు",
				summary: "హెచ్చరిక: ఖచ్చితంగా లేని లేదా అనుచితమైన దిద్దుబాటు సారాంశాలు"
			}
		},
		block: {
			"uw-block": {
				label: "నిరోధం",
				summary: "దిద్దుబాటు చెయ్యకుండా మిమ్మల్ని నిరోధించారు",
				pageParam: true,
				reasonParam: true // allows editing of reason for generic templates
			},
			"uw-blocknotalk": {
				label: "నిరోధం - చర్చ పేజీని అశక్తం చేసారు",
				summary: "You have been blocked from editing and your user talk page has been disabled",
				pageParam: true,
				reasonParam: true
			},
			"uw-blockindef": {
				label: "శాశ్వత నిరోధం",
				summary: "దిద్దుబాట్లేమీ చెయ్యకుండా మిమ్మల్నిశాశ్వతంగా నిరోధించారు",
				indefinite: true,
				pageParam: true,
				reasonParam: true
			},
			"uw-ablock": {
				label: "ఐపీ అడ్రసు నిరోధం",
				summary: "Your IP address has been blocked from editing",
				pageParam: true
			},
			"uw-vblock": {
				label: "దుశ్చర్య నిరోధం",
				summary: "పదేపదే [[వికీపీడియా:దుశ్చర్య|దుశ్చర్య]] చేస్తున్న కారణంగా మిమ్మల్ని, దిద్దుబాట్లేమీ చెయ్యకుండా నిరోధించారు",
				pageParam: true
			},
			"uw-voablock": {
				label: "దుశ్చర్య కోసమే ఉన్న ఖాతా నిరోధం (శాశ్వత)",
				summary: "You have been indefinitely blocked from editing because your account is being [[WP:VOA|used only for vandalism]]",
				indefinite: true,
				pageParam: true
			},
			"uw-bioblock": {
				label: "BLP ఉల్లంఘన నిరోధం",
				summary: "You have been blocked from editing for violations of Wikipedia's [[WP:BLP|biographies of living persons policy]]",
				pageParam: true
			},
			"uw-sblock": {
				label: "స్పాము నిరోధం",
				summary: "You have been blocked from editing for using Wikipedia for [[WP:SPAM|spam]] purposes"
			},
			"uw-adblock": {
				label: "Advertising block",
				summary: "You have been blocked from editing for [[WP:SOAP|advertising or self-promotion]]",
				pageParam: true
			},
			"uw-soablock": {
				label: "Spam/advertising-only account block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your account is being used only for [[WP:SPAM|spam, advertising, or promotion]]",
				indefinite: true,
				pageParam: true
			},
			"uw-npblock": {
				label: "Creating nonsense pages block",
				summary: "You have been blocked from editing for creating [[WP:PN|nonsense pages]]",
				pageParam: true
			},
			"uw-copyrightblock": {
				label: "Copyright violation block",
				summary: "You have been blocked from editing for continued [[WP:COPYVIO|copyright infringement]]",
				pageParam: true
			},
			"uw-spoablock": {
				label: "Sockpuppet account block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your account is being used only for [[WP:SOCK|sock puppetry]]",
				indefinite: true
			},
			"uw-hblock": {
				label: "Harassment block",
				summary: "You have been blocked from editing for attempting to [[WP:HARASS|harass]] other users",
				pageParam: true
			},
			"uw-ewblock": {
				label: "Edit warring block",
				summary: "You have been blocked from editing to prevent further [[WP:DE|disruption]] caused by your engagement in an [[WP:EW|edit war]]",
				pageParam: true
			},
			"uw-3block": {
				label: "Three-revert rule violation block",
				summary: "You have been blocked from editing for violation of the [[WP:3RR|three-revert rule]]",
				pageParam: true
			},
			"uw-disruptblock": {
				label: "Disruptive editing block",
				summary: "You have been blocked from editing for [[WP:DE|disruptive editing]]",
				pageParam: true
			},
			"uw-deoablock": {
				label: "Disruption/trolling-only account block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your account is being used only for [[WP:DE|trolling, disruption or harassment]]",
				indefinite: true,
				pageParam: true
			},
			"uw-lblock": {
				label: "Legal threat block (indefinite)",
				summary: "You have been indefinitely blocked from editing for making [[WP:NLT|legal threats or taking legal action]]",
				indefinite: true
			},
			"uw-aeblock": {
				label: "Arbitration enforcement block",
				summary: "You have been blocked from editing for violating an [[WP:Arbitration|arbitration decision]] with your edits",
				pageParam: true,
				reasonParam: true
			},
			"uw-efblock": {
				label: "Edit filter-related block",
				summary: "You have been blocked from editing for making disruptive edits that repeatedly triggered the [[WP:EF|edit filter]]"
			},
			"uw-myblock": {
				label: "Social networking block",
				summary: "You have been blocked from editing for using user and/or article pages as a [[WP:NOTMYSPACE|blog, web host, social networking site or forum]]",
				pageParam: true
			},
			"uw-dblock": {
				label: "Deletion/removal of content block",
				summary: "You have been blocked from editing for continued [[WP:VAND|removal of material]]",
				pageParam: true
			},
			"uw-compblock": {
				label: "Possible compromised account block (indefinite)",
				summary: "You have been indefinitely blocked from editing because it is believed that your [[WP:SECURE|account has been compromised]]",
				indefinite: true
			},
			"uw-botblock": {
				label: "Unapproved bot block",
				summary: "You have been blocked from editing because it appears you are running a [[WP:BOT|bot script]] without [[WP:BRFA|approval]]",
				pageParam: true
			},
			"uw-ublock": {
				label: "Username soft block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your username is a violation of the [[WP:U|username policy]]",
				indefinite: true,
				reasonParam: true
			},
			"uw-uhblock": {
				label: "Username hard block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your username is a blatant violation of the [[WP:U|username policy]]",
				indefinite: true,
				reasonParam: true
			},
			"uw-softerblock": {
				label: "Promotional username soft block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your [[WP:U|username]] gives the impression that the account represents a group, organization or website",
				indefinite: true
			},
			"uw-causeblock": {
				label: "Promotional username soft block, for charitable causes (indefinite)",
				summary: "You have been indefinitely blocked from editing because your [[WP:U|username]] gives the impression that the account represents a group, organization or website",
				indefinite: true
			},
			"uw-botublock": {
				label: "Bot username soft block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your [[WP:U|username]] indicates this is a [[WP:BOT|bot]] account, which is currently not approved",
				indefinite: true
			},
			"uw-memorialblock": {
				label: "Memorial username soft block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your [[WP:U|username]] indicates this account may be used as a memorial or tribute to someone",
				indefinite: true
			},
			"uw-ublock-famous": {
				label: "Famous username soft block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your [[WP:U|username]] matches the name of a well-known living individual",
				indefinite: true
			},
			"uw-ublock-double": {
				label: "Similar username soft block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your [[WP:U|username]] is too similar to the username of another Wikipedia user",
				indefinite: true
			},
			"uw-uhblock-double": {
				label: "Username impersonation hard block (indefinite)",
				summary: "You have been indefinitely blocked from editing because your [[WP:U|username]] appears to impersonate another established Wikipedia user",
				indefinite: true
			},
			"uw-vaublock": {
				label: "దుశ్చర కోసం మాత్రమే ఖాతా, వాడుకరిపేరు నిరోధం (అనిశ్చిత కాలం)",
				summary: "మీ ఖాతాను [[WP:VOA|దుశ్చరకు మాత్రమే వాడుతున్నారు కాబట్టి]], మీ వాడుకరిపేరు [[WP:U|వాడుకరిపేరు విధానాన్ని]] ఉల్లంఘిస్తోంది కాబట్టీ మిమ్మల్ని శాశ్వతంగా నిరోధించాం",
				indefinite: true,
				pageParam: true
			},
			"uw-spamublock": {
				label: "స్పాము కోసం మాత్రమే ఖాతా, ప్రచారం కోసం వాడుకరిపేరు నిరోధం (అనిశ్చిత కాలం)",
				summary: "మీ ఖాతాను [[WP:SPAM|స్పాము కోసం మాత్రమే వాడుతున్నారు కాబట్టి]], మీ వాడుకరిపేరు [[WP:U|వాడుకరిపేరు విధానాన్ని]] ఉల్లంఘిస్తోంది కాబట్టీ మిమ్మల్ని శాశ్వతంగా నిరోధించాం",
				indefinite: true
			}
		}
	};

	Twinkle.warn.prev_block_timer = null;
	Twinkle.warn.prev_block_reason = null;
	Twinkle.warn.prev_article = null;
	Twinkle.warn.prev_reason = null;

	Twinkle.warn.callback.change_category = function twinklewarnCallbackChangeCategory(e) {
		var value = e.target.value;
		var sub_group = e.target.root.sub_group;
		var messages = Twinkle.warn.messages[value];
		sub_group.main_group = value;
		var old_subvalue = sub_group.value;
		var old_subvalue_re;
		if (old_subvalue) {
			old_subvalue = old_subvalue.replace(/\d*(im)?$/, '');
			old_subvalue_re = new RegExp(RegExp.escape(old_subvalue) + "(\\d*(?:im)?)$");
		}

		while (sub_group.hasChildNodes()) {
			sub_group.removeChild(sub_group.firstChild);
		}

		for (var i in messages) {
			var selected = false;
			if (old_subvalue && old_subvalue_re.test(i)) {
				selected = true;
			}
			var elem = new Morebits.quickForm.element({
				type: 'option',
				label: "{{" + i + "}}: " + messages[i].label,
				value: i,
				selected: selected
			});

			sub_group.appendChild(elem.render());
		}

		if (value === 'block') {
			// create the block-related fields
			var more = new Morebits.quickForm.element({
				type: 'div',
				id: 'block_fields'
			});
			more.append({
				type: 'input',
				name: 'block_timer',
				label: 'నిరోధ కాలం: ',
				tooltip: 'నిరోధం ఎన్నాళ్ళుంటుందో చెప్పడం, ఉదాహరణకు 24 గంటలు, 2 వారాలు, అనిశ్చిత కాలం వగైరా..'
			});
			more.append({
				type: 'input',
				name: 'block_reason',
				label: '"మిమ్మల్ని నిరోదించిన కారణం ఏంటంటే ..." ',
				tooltip: 'మామూలుగా చూపే కారణం స్థానంలో మీరు కారణం రావచ్చు. జనరిక్ నిరోధ మూసలకే ఇది వర్తిస్తుంది..'
			});
			e.target.root.insertBefore(more.render(), e.target.root.lastChild);

			// restore saved values of fields
			if (Twinkle.warn.prev_block_timer !== null) {
				e.target.root.block_timer.value = Twinkle.warn.prev_block_timer;
				Twinkle.warn.prev_block_timer = null;
			}
			if (Twinkle.warn.prev_block_reason !== null) {
				e.target.root.block_reason.value = Twinkle.warn.prev_block_reason;
				Twinkle.warn.prev_block_reason = null;
			}
			if (Twinkle.warn.prev_article === null) {
				Twinkle.warn.prev_article = e.target.root.article.value;
			}
			e.target.root.article.disabled = false;

			$(e.target.root.reason).parent().hide();
			e.target.root.previewer.closePreview();
		} else if (e.target.root.block_timer) {
			// hide the block-related fields
			if (!e.target.root.block_timer.disabled && Twinkle.warn.prev_block_timer === null) {
				Twinkle.warn.prev_block_timer = e.target.root.block_timer.value;
			}
			if (!e.target.root.block_reason.disabled && Twinkle.warn.prev_block_reason === null) {
				Twinkle.warn.prev_block_reason = e.target.root.block_reason.value;
			}

			// hack to fix something really weird - removed elements seem to somehow keep an association with the form
			e.target.root.block_reason = null;

			$(e.target.root).find("#block_fields").remove();

			if (e.target.root.article.disabled && Twinkle.warn.prev_article !== null) {
				e.target.root.article.value = Twinkle.warn.prev_article;
				Twinkle.warn.prev_article = null;
			}
			e.target.root.article.disabled = false;

			$(e.target.root.reason).parent().show();
			e.target.root.previewer.closePreview();
		}

		// clear overridden label on article textbox
		Morebits.quickForm.setElementTooltipVisibility(e.target.root.article, true);
		Morebits.quickForm.resetElementLabel(e.target.root.article);

		// hide the big red notice
		$("#tw-warn-red-notice").remove();
	};

	Twinkle.warn.callback.change_subcategory = function twinklewarnCallbackChangeSubcategory(e) {
		var main_group = e.target.form.main_group.value;
		var value = e.target.form.sub_group.value;

		if (main_group === 'singlenotice' || main_group === 'singlewarn') {
			if (value === 'uw-bite' || value === 'uw-username' || value === 'uw-socksuspect') {
				if (Twinkle.warn.prev_article === null) {
					Twinkle.warn.prev_article = e.target.form.article.value;
				}
				e.target.form.article.notArticle = true;
				e.target.form.article.value = '';
			} else if (e.target.form.article.notArticle) {
				if (Twinkle.warn.prev_article !== null) {
					e.target.form.article.value = Twinkle.warn.prev_article;
					Twinkle.warn.prev_article = null;
				}
				e.target.form.article.notArticle = false;
			}
		} else if (main_group === 'block') {
			if (Twinkle.warn.messages.block[value].indefinite) {
				if (Twinkle.warn.prev_block_timer === null) {
					Twinkle.warn.prev_block_timer = e.target.form.block_timer.value;
				}
				e.target.form.block_timer.disabled = true;
				e.target.form.block_timer.value = 'indefinite';
			} else if (e.target.form.block_timer.disabled) {
				if (Twinkle.warn.prev_block_timer !== null) {
					e.target.form.block_timer.value = Twinkle.warn.prev_block_timer;
					Twinkle.warn.prev_block_timer = null;
				}
				e.target.form.block_timer.disabled = false;
			}

			if (Twinkle.warn.messages.block[value].pageParam) {
				if (Twinkle.warn.prev_article !== null) {
					e.target.form.article.value = Twinkle.warn.prev_article;
					Twinkle.warn.prev_article = null;
				}
				e.target.form.article.disabled = false;
			} else if (!e.target.form.article.disabled) {
				if (Twinkle.warn.prev_article === null) {
					Twinkle.warn.prev_article = e.target.form.article.value;
				}
				e.target.form.article.disabled = true;
				e.target.form.article.value = '';
			}

			if (Twinkle.warn.messages.block[value].reasonParam) {
				if (Twinkle.warn.prev_block_reason !== null) {
					e.target.form.block_reason.value = Twinkle.warn.prev_block_reason;
					Twinkle.warn.prev_block_reason = null;
				}
				e.target.form.block_reason.disabled = false;
			} else if (!e.target.form.block_reason.disabled) {
				if (Twinkle.warn.prev_block_reason === null) {
					Twinkle.warn.prev_block_reason = e.target.form.block_reason.value;
				}
				e.target.form.block_reason.disabled = true;
				e.target.form.block_reason.value = '';
			}
		}

		// change form labels according to the warning selected
		if (value === "uw-socksuspect") {
			Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, false);
			Morebits.quickForm.overrideElementLabel(e.target.form.article, "Username of sock master, if known (without User:) ");
		} else if (value === "uw-username") {
			Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, false);
			Morebits.quickForm.overrideElementLabel(e.target.form.article, "Username violates policy because... ");
		} else if (value === "uw-bite") {
			Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, false);
			Morebits.quickForm.overrideElementLabel(e.target.form.article, "Username of 'bitten' user (without User:) ");
		} else {
			Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, true);
			Morebits.quickForm.resetElementLabel(e.target.form.article);
		}

		// add big red notice, warning users about how to use {{uw-username}} appropriately
		if (value === "uw-username") {
			var $redWarning = $("<div style='color: red;' id='tw-warn-red-notice'>{{uw-username}} should <b>not</b> be used for <b>blatant</b> username policy violations. " +
				"Blatant violations should be reported directly to UAA (via Twinkle's ARV tab). " +
				"{{uw-username}} should only be used in edge cases in order to engage in discussion with the user.</div>");
			$redWarning.insertAfter(Morebits.quickForm.getElementLabelObject(e.target.form.reasonGroup));
		} else {
			$("#tw-warn-red-notice").remove();
		}
	};

	Twinkle.warn.callbacks = {
		preview: function(form) {
			var templatename = form.sub_group.value;

			var templatetext = '{{subst:' + templatename;
			var linkedarticle = form.article.value;
			if (templatename in Twinkle.warn.messages.block) {
				if (linkedarticle && Twinkle.warn.messages.block[templatename].pageParam) {
					templatetext += '|page=' + linkedarticle;
				}

				var blocktime = form.block_timer.value;
				if (/te?mp|^\s*$|min/.exec(blocktime) || Twinkle.warn.messages.block[templatename].indefinite) {; // nothing
				} else if (/indef|\*|max/.exec(blocktime)) {
					templatetext += '|indef=yes';
				} else {
					templatetext += '|time=' + blocktime;
				}

				var blockreason = form.block_reason.value;
				if (blockreason) {
					templatetext += '|reason=' + blockreason;
				}

				templatetext += "|sig=true}}";
			} else {
				if (linkedarticle) {
					// add linked article for user warnings (non-block templates)
					templatetext += '|1=' + linkedarticle;
				}
				templatetext += '}}';

				// add extra message for non-block templates
				var reason = form.reason.value;
				if (reason) {
					templatetext += " ''" + reason + "''";
				}
			}

			form.previewer.beginRender(templatetext);
		},
		main: function(pageobj) {
			var text = pageobj.getPageText();
			var params = pageobj.getCallbackParameters();
			var messageData = Twinkle.warn.messages[params.main_group][params.sub_group];

			var history_re = /<!-- Template:(uw-.*?) -->.*?(\d{1,2}:\d{1,2}, \d{1,2} \w+ \d{4}) \(UTC\)/g;
			var history = {};
			var latest = {
				date: new Date(0),
				type: ''
			};
			var current;

			while ((current = history_re.exec(text))) {
				var current_date = new Date(current[2] + ' UTC');
				if (!(current[1] in history) || history[current[1]] < current_date) {
					history[current[1]] = current_date;
				}
				if (current_date > latest.date) {
					latest.date = current_date;
					latest.type = current[1];
				}
			}

			var date = new Date();

			if (params.sub_group in history) {
				var temp_time = new Date(history[params.sub_group]);
				temp_time.setUTCHours(temp_time.getUTCHours() + 24);

				if (temp_time > date) {
					if (!confirm("An identical " + params.sub_group + " has been issued in the last 24 hours.  \nWould you still like to add this warning/notice?")) {
						pageobj.statelem.info('వాడుకరి అభ్యర్థన మేరకు ఆపేసాం');
						return;
					}
				}
			}

			latest.date.setUTCMinutes(latest.date.getUTCMinutes() + 1); // after long debate, one minute is max

			if (latest.date > date) {
				if (!confirm("A " + latest.type + " has been issued in the last minute.  \nWould you still like to add this warning/notice?")) {
					pageobj.statelem.info('వాడుకరి అభ్యర్థన మేరకు ఆపేసాం');
					return;
				}
			}

			var mainheaderRe = new RegExp("==+\\s*Warnings\\s*==+");
			var headerRe = new RegExp("^==+\\s*(?:" + date.getUTCMonthName() + '|' + date.getUTCMonthNameAbbrev() + ")\\s+" + date.getUTCFullYear() + "\\s*==+", 'm');

			if (text.length > 0) {
				text += "\n\n";
			}

			if (params.main_group === 'block') {
				var article = '',
					reason = '',
					time = null;

				if (Twinkle.getPref('blankTalkpageOnIndefBlock') && params.sub_group !== 'uw-lblock' && (Twinkle.warn.messages.block[params.sub_group].indefinite || (/indef|\*|max/).exec(params.block_timer))) {
					Morebits.status.info('Info', 'Blanking talk page per preferences and creating a new level 2 heading for the date');
					text = "== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ==\n";
				} else if (!headerRe.exec(text)) {
					Morebits.status.info('Info', 'Will create a new level 2 heading for the date, as none was found for this month');
					text += "== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ==\n";
				}

				if (params.article && Twinkle.warn.messages.block[params.sub_group].pageParam) {
					article = '|page=' + params.article;
				}

				if (params.reason && Twinkle.warn.messages.block[params.sub_group].reasonParam) {
					reason = '|reason=' + params.reason;
				}

				if (/te?mp|^\s*$|min/.exec(params.block_timer) || Twinkle.warn.messages.block[params.sub_group].indefinite) {
					time = '';
				} else if (/indef|\*|max/.exec(params.block_timer)) {
					time = '|indef=yes';
				} else {
					time = '|time=' + params.block_timer;
				}

				text += "{{subst:" + params.sub_group + article + time + reason + "|sig=true|subst=subst:}}";
			} else {
				if (!headerRe.exec(text)) {
					Morebits.status.info('Info', 'Will create a new level 2 heading for the date, as none was found for this month');
					text += "== " + date.getUTCMonthName() + " " + date.getUTCFullYear() + " ==\n";
				}
				text += "{{subst:" + params.sub_group + (params.article ? '|1=' + params.article : '') + "|subst=subst:}}" + (params.reason ? " ''" + params.reason + "'' " : ' ') + "~~~~";
			}

			if (Twinkle.getPref('showSharedIPNotice') && Morebits.isIPAddress(mw.config.get('wgTitle'))) {
				Morebits.status.info('Info', 'Adding a shared IP notice');
				text += "\n{{subst:SharedIPAdvice}}";
			}

			var summary = messageData.summary;
			if (messageData.suppressArticleInSummary !== true && params.article) {
				if (params.sub_group === "uw-socksuspect") { // this template requires a username
					summary += " of [[User:" + params.article + "]]";
				} else {
					summary += " on [[" + params.article + "]]";
				}
			}
			summary += "." + Twinkle.getPref("summaryAd");

			pageobj.setPageText(text);
			pageobj.setEditSummary(summary);
			pageobj.setWatchlist(Twinkle.getPref('watchWarnings'));
			pageobj.save();
		}
	};

	Twinkle.warn.callback.evaluate = function twinklewarnCallbackEvaluate(e) {

		// First, check to make sure a reason was filled in if uw-username was selected

		if (e.target.sub_group.value === 'uw-username' && e.target.article.value.trim() === '') {
			alert("{{uw-username}} మూసను వాడాలంటే, మీరొక కారణం ఇవ్వడం తప్పనిసరి");
			return;
		}

		// Then, grab all the values provided by the form

		var params = {
			reason: e.target.block_reason ? e.target.block_reason.value : e.target.reason.value,
			main_group: e.target.main_group.value,
			sub_group: e.target.sub_group.value,
			article: e.target.article.value, // .replace( /^(Image|Category):/i, ':$1:' ),  -- apparently no longer needed...
			block_timer: e.target.block_timer ? e.target.block_timer.value : null
		};

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(e.target);

		Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
		Morebits.wiki.actionCompleted.notice = "హెచ్చరించడం పూర్తయింది, కొద్ది క్షణాల్లో చర్చ పేజీని తిరిగి లోడు చేస్తాం";

		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'వాడుకరి చర్చ పేజీ సవరణ');
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.setFollowRedirect(true);
		wikipedia_page.load(Twinkle.warn.callbacks.main);
	};

	/*
	 ****************************************
	 *** twinklexfd.js: XFD module
	 ****************************************
	 * Mode of invocation:     Tab ("XFD")
	 * Active on:              Existing, non-special pages, except for file pages with no local (non-Commons) file which are not redirects
	 * Config directives in:   TwinkleConfig
	 */

	Twinkle.xfd = function twinklexfd() {
		// Disable on:
		// * special pages
		// * non-existent pages
		// * files on Commons, whether there is a local page or not (unneeded local pages of files on Commons are eligible for CSD F2)
		// * file pages without actual files (these are eligible for CSD G8)
		if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId') || (mw.config.get('wgNamespaceNumber') === 6 && (document.getElementById('mw-sharedupload') || (!document.getElementById('mw-imagepage-section-filehistory') && !Morebits.wiki.isPageRedirect())))) {
			return;
		}
		twAddPortletLink(Twinkle.xfd.callback, "XFD", "tw-xfd", "తొలగింపు నామినేషను");
	};

	Twinkle.xfd.num2order = function twinklexfdNum2order(num) {
		switch (num) {
			case 1:
				return '';
			case 2:
				return '2వ';
			case 3:
				return '3వ';
			default:
				return num + 'వ';
		}
	};

	Twinkle.xfd.currentRationale = null;

	// error callback on Morebits.status.object
	Twinkle.xfd.printRationale = function twinklexfdPrintRationale() {
		if (Twinkle.xfd.currentRationale) {
			var p = document.createElement("p");
			p.textContent = "Your deletion rationale is provided below, which you can copy and paste into a new XFD dialog if you wish to try again:";
			var pre = document.createElement("pre");
			pre.className = "toccolours";
			pre.style.marginTop = "0";
			pre.textContent = Twinkle.xfd.currentRationale;
			p.appendChild(pre);
			Morebits.status.root.appendChild(p);
			// only need to print the rationale once
			Twinkle.xfd.currentRationale = null;
		}
	};

	Twinkle.xfd.callback = function twinklexfdCallback() {
		if (!twinkleUserAuthorized) {
			alert("మీ ఖాతా మరీ కొత్తది, ట్వింకిల్ వాడలేరు.");
			return;
		}

		var Window = new Morebits.simpleWindow(600, 350);
		Window.setTitle("తొలగింపుకు నామినేటు చెయ్యండి (XfD)");
		Window.setScriptName("ట్వింకిల్");
		Window.addFooterLink("తొలగింపు చర్చల గురించి", "WP:XFD");
		Window.addFooterLink("ట్వింకిల్ సహాయం", "WP:TW/DOC#xfd");

		var form = new Morebits.quickForm(Twinkle.xfd.callback.evaluate);
		var categories = form.append({
			type: 'select',
			name: 'category',
			label: 'తొలగింపు చర్చ జరిగే చోటు:',
			tooltip: 'మీరున్న పేరుబరిని బట్టి డిఫాల్టుగా ఒక ఎంపిక చేస్తుంది. ఆ ఎంపిక చాలావరకు సముచితంగా ఉంటుంది',
			event: Twinkle.xfd.callback.change_category
		});
		categories.append({
			type: 'option',
			label: 'AfD (తొలగింపు కొరకు వ్యాసాలు)',
			selected: mw.config.get('wgNamespaceNumber') === 0, // Main namespace
			value: 'afd'
		});
		categories.append({
			type: 'option',
			label: 'TfD (చర్చ కొరకు మూసలు)',
			selected: mw.config.get('wgNamespaceNumber') === 10, // Template namespace
			value: 'tfd'
		});
		categories.append({
			type: 'option',
			label: 'FfD (తొలగింపు కొరకు దస్త్రాలు)/PUF (బహుశా ఉచితం కాని దస్త్రాలు)',
			selected: mw.config.get('wgNamespaceNumber') === 6, // File namespace
			value: 'ffd'
		});
		categories.append({
			type: 'option',
			label: 'CfD (చర్చ కొరకు వర్గాలు)',
			selected: mw.config.get('wgNamespaceNumber') === 14, // Category namespace
			value: 'cfd'
		});
		categories.append({
			type: 'option',
			label: 'CfD/S (సత్వర పేరుమార్పు కోసం వర్గాలు)',
			value: 'cfds'
		});
		categories.append({
			type: 'option',
			label: 'MfD (తొలగింపు కొరకు ఇతర పేజీలు)',
			selected: [0, 6, 10, 14].indexOf(mw.config.get('wgNamespaceNumber')) === -1,
			value: 'mfd'
		});
		categories.append({
			type: 'option',
			label: 'RfD (చర్చ కొరకు దారిమార్పులు)',
			selected: Morebits.wiki.isPageRedirect(),
			value: 'rfd'
		});
		form.append({
			type: 'checkbox',
			list: [{
				label: 'వీలైతే పేజీ సృష్టికర్తకు తెలియపరచు',
				value: 'notify',
				name: 'notify',
				tooltip: "దీనిలో టిక్కు పెడితే, పేజీ సృష్టికర్త చర్చ పేజీలో ఒక గమనింపు మూసను పెడతాం.",
				checked: true
			}]
		});
		form.append({
			type: 'field',
			label: 'Work area',
			name: 'work_area'
		});
		form.append({
			type: 'submit'
		});

		var result = form.render();
		Window.setContent(result);
		Window.display();

		// We must init the controls
		var evt = document.createEvent("Event");
		evt.initEvent('change', true, true);
		result.category.dispatchEvent(evt);
	};

	Twinkle.xfd.previousNotify = true;

	Twinkle.xfd.callback.change_category = function twinklexfdCallbackChangeCategory(e) {
		var value = e.target.value;
		var form = e.target.form;
		var old_area = Morebits.quickForm.getElements(e.target.form, "work_area")[0];
		var work_area = null;

		var oldreasontextbox = form.getElementsByTagName('textarea')[0];
		var oldreason = (oldreasontextbox ? oldreasontextbox.value : '');

		switch (value) {
			case 'afd':
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'తొలగింపు కొరకు వ్యాసాలు',
					name: 'work_area'
				});
				work_area.append({
					type: 'checkbox',
					list: [{
						label: 'తొలగింపు ట్యాగును <noinclude> తో కప్పి ఉంచు',
						value: 'noinclude',
						name: 'noinclude',
						tooltip: 'తొలగింపు ట్యాగును &lt;noinclude&gt; ట్యాగుల మధ్య ఉంచడం వలన అది ట్రాన్స్‌క్లూడు కాదు. ఇది సాధారణంగా అవసరం పడదు.'
					}]
				});
				var afd_category = work_area.append({
					type: 'select',
					name: 'xfdcat',
					label: 'ఈ నామినేషను ఏ రకానికి చెందుతుందో ఎంచుకోండి:'
				});

				afd_category.append({
					type: 'option',
					label: 'ఏ రకమో తెలియదు',
					value: '?',
					selected: true
				});
				afd_category.append({
					type: 'option',
					label: 'మీడియా, సంగీతం',
					value: 'M'
				});
				afd_category.append({
					type: 'option',
					label: 'సంస్థ, కార్పొరేషను, ఉత్పత్తి',
					value: 'O'
				});
				afd_category.append({
					type: 'option',
					label: 'జీవిత చరిత్ర',
					value: 'B'
				});
				afd_category.append({
					type: 'option',
					label: 'సామాజిక అంశాలు',
					value: 'S'
				});
				afd_category.append({
					type: 'option',
					label: 'వెబ్, అంతర్జాలం',
					value: 'W'
				});
				afd_category.append({
					type: 'option',
					label: 'క్రీడలు',
					value: 'G'
				});
				afd_category.append({
					type: 'option',
					label: 'శాస్త్ర సాంకేతికం',
					value: 'T'
				});
				afd_category.append({
					type: 'option',
					label: 'కల్పన, కళలు',
					value: 'F'
				});
				afd_category.append({
					type: 'option',
					label: 'ప్రదేశాలు, రవాణా',
					value: 'P'
				});
				afd_category.append({
					type: 'option',
					label: 'స్పష్టంగా తెలియనివి, వర్గీకరించనివి',
					value: 'I'
				});
				afd_category.append({
					type: 'option',
					label: 'ఇంకా పరిష్కరించని చర్చలు',
					value: 'U'
				});

				work_area.append({
					type: 'textarea',
					name: 'xfdreason',
					label: 'కారణం: ',
					value: oldreason
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
			case 'tfd':
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'చర్చ కొరకు మూసలు',
					name: 'work_area'
				});
				work_area.append({
					type: 'div',
					label: 'మొలకలు, వాడుకరిపెట్టెలు TfD కిందికి రావు. మొలకలు CfD కిందికీ, వాడుకరిపెట్టెలు MfD కిందికీ వస్తాయి.'
				});
				work_area.append({
					type: 'checkbox',
					list: [{
						label: 'ఇన్‌లైన్ తొలగింపు ట్యాగు',
						value: 'tfdinline',
						name: 'tfdinline',
						tooltip: '{{tfd}} ట్యాగు బదులు {{tfd|type=inline}} ఆని వాడండి. ఇది ఇన్‌లైను మూసలకు బాగుంటుంది.',
						checked: false
					}, {
						label: 'తొలగింపు ట్యాగును <noinclude> తో కప్పి ఉంచు (సబ్‌స్టిట్యూటు చేసిన మూసలకు మాత్రమే)',
						value: 'noinclude',
						name: 'noinclude',
						tooltip: 'తొలగింపు ట్యాగును &lt;noinclude&gt;  ట్యాగుల మధ్య ఉంచుతుంది. దాంతో అది మూసతో పాటు సబ్‌స్టిట్యూటు కాదు.'
					}]
				});
				work_area.append({
					type: 'textarea',
					name: 'xfdreason',
					label: 'కారణం: ',
					value: oldreason
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
			case 'mfd':
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'తొలగింపు కొరకు ఇతర పేజీలు',
					name: 'work_area'
				});
				work_area.append({
					type: 'checkbox',
					list: [{
						label: 'తొలగింపు ట్యాగును <noinclude> తో కప్పి ఉంచు',
						value: 'noinclude',
						name: 'noinclude',
						tooltip: 'తొలగింపు ట్యాగును &lt;noinclude&gt;  ట్యాగుల మధ్య ఉంచుతుంది. దాంతో అది మూసతో పాటు ట్రాన్స్‌క్లూడు కాదు. దీన్ని వాడుకరిపెట్టెల కోసం వాడండి'
					}]
				});
				if (mw.config.get('wgNamespaceNumber') === 2 /* User: */ || mw.config.get('wgNamespaceNumber') === 3 /* User talk: */ ) {
					work_area.append({
						type: 'checkbox',
						list: [{
							label: 'ఈ పేజీని సృష్టించినది ఈ వాడుకరిస్థలపు స్వంతదారు కాకపోతే, ఆ స్వంతదారుకు కూడా తెలియపరచు',
							value: 'notifyuserspace',
							name: 'notifyuserspace',
							tooltip: 'ఈ వాడుకరి స్థలపు స్వంతదారు ఈ పేజీ సృష్టికర్త కాకపోతే (ఉదాహరణకు, ఈ పేజీని కాపాడి వాడుకరి పేరుబరిలో చేర్చి ఉంటే), సదరు వాడుకరిస్థలపు స్వంతదారుకు కూడా తెలియపరచు.',
							checked: true
						}]
					});
				}
				work_area.append({
					type: 'textarea',
					name: 'xfdreason',
					label: 'కారణం: ',
					value: oldreason
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
			case 'ffd':
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'తొలగింపు కొరకు దస్త్రాలు',
					name: 'work_area'
				});
				work_area.append({
					type: 'checkbox',
					name: 'puf',
					list: [{
						label: 'బహుశా ఉచితం కాని దస్త్రమై ఉండవచ్చు',
						value: 'puf',
						tooltip: 'దస్త్రపు మూలం గానీ, లైసెన్సు సమాచారం గానీ వివాదాస్పదమై ఉండవచ్చు '
					}]
				});
				work_area.append({
					type: 'textarea',
					name: 'xfdreason',
					label: 'కారణం: ',
					value: oldreason
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
			case 'cfd':
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'చర్చ కొరకు వర్గాలు',
					name: 'work_area'
				});
				var cfd_category = work_area.append({
					type: 'select',
					label: 'తీసుకోదలచిన చర్యను ఎంచుకోండి: ',
					name: 'xfdcat',
					event: function(e) {
						var value = e.target.value;
						var target = e.target.form.xfdtarget;
						// update enabled status
						if (value === 'cfd') {
							target.disabled = true;
						} else {
							target.disabled = false;
						}
						// update label
						if (value === 'cfs') {
							target.previousSibling.textContent = "Target categories: ";
						} else if (value === 'cfc') {
							target.previousSibling.textContent = "Target article: ";
						} else {
							target.previousSibling.textContent = "Target category: ";
						}
						// add/remove extra input box
						if (value === 'cfs' && $(target.parentNode).find("input[name='xfdtarget2']").length === 0) {
							var xfdtarget2 = document.createElement("input");
							xfdtarget2.setAttribute("name", "xfdtarget2");
							xfdtarget2.setAttribute("type", "text");
							target.parentNode.appendChild(xfdtarget2);
						} else {
							$(target.parentNode).find("input[name='xfdtarget2']").remove();
						}
					}
				});
				cfd_category.append({
					type: 'option',
					label: 'తొలగింపు',
					value: 'cfd',
					selected: true
				});
				cfd_category.append({
					type: 'option',
					label: 'విలీనం',
					value: 'cfm'
				});
				cfd_category.append({
					type: 'option',
					label: 'పేరుమార్పు',
					value: 'cfr'
				});
				cfd_category.append({
					type: 'option',
					label: 'విభజన',
					value: 'cfs'
				});
				cfd_category.append({
					type: 'option',
					label: 'వ్యాసంగా మార్పు',
					value: 'cfc'
				});

				work_area.append({
					type: 'input',
					name: 'xfdtarget',
					label: 'లక్ష్యం పేజీ: ',
					disabled: true,
					value: ''
				});
				work_area.append({
					type: 'textarea',
					name: 'xfdreason',
					label: 'కారణం: ',
					value: oldreason
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
			case 'cfds':
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'సత్వర పేరుమార్పు కొరకు వర్గాలు',
					name: 'work_area'
				});
				var cfds_category = work_area.append({
					type: 'select',
					label: 'C2 ఉప కారణం: ',
					name: 'xfdcat',
					tooltip: 'పూర్తి వివరాల కోసం WP:CFDS చూడండి.',
					event: function(e) {
						var value = e.target.value;
						var target = e.target.form.xfdtarget;
						if (value === 'cfd') {
							target.disabled = true;
						} else {
							target.disabled = false;
						}
					}
				});
				cfds_category.append({
					type: 'option',
					label: 'C2A: టైపింగు దోషాలు, అక్షరక్రమ దోషాలు',
					value: 'C2A',
					selected: true
				});
				cfds_category.append({
					type: 'option',
					label: 'C2B: నామకరణ పద్ధతులు, అయోమయ నివృత్తి',
					value: 'C2B'
				});
				cfds_category.append({
					type: 'option',
					label: 'C2C: ఇలాంటి ఇతర వర్గాల పేర్లకు అనుగుణ్యం',
					value: 'C2C'
				});
				cfds_category.append({
					type: 'option',
					label: 'C2D: వ్యాసం పేరుతో సరిపోయేలా పేరుమార్పు',
					value: 'C2D'
				});
				cfds_category.append({
					type: 'option',
					label: 'C2E: కర్త అభ్యర్థన',
					value: 'C2E'
				});

				work_area.append({
					type: 'input',
					name: 'xfdtarget',
					label: 'కొత్త పేరు: ',
					value: ''
				});
				work_area.append({
					type: 'textarea',
					name: 'xfdreason',
					label: 'కారణం: ',
					value: oldreason
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
			case 'rfd':
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'చర్చ కొరకు దారిమార్పులు',
					name: 'work_area'
				});
				work_area.append({
					type: 'textarea',
					name: 'xfdreason',
					label: 'కారణం: ',
					value: oldreason
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
			default:
				work_area = new Morebits.quickForm.element({
					type: 'field',
					label: 'Nothing for anything',
					name: 'work_area'
				});
				work_area = work_area.render();
				old_area.parentNode.replaceChild(work_area, old_area);
				break;
		}

		// No creator notification for CFDS
		if (value === "cfds") {
			Twinkle.xfd.previousNotify = form.notify.checked;
			form.notify.checked = false;
			form.notify.disabled = true;
		} else {
			form.notify.checked = Twinkle.xfd.previousNotify;
			form.notify.disabled = false;
		}
	};

	Twinkle.xfd.callbacks = {
		afd: {
			main: function(apiobj) {
				var xmlDoc = apiobj.responseXML;
				var titles = $(xmlDoc).find('allpages p');

				// There has been no earlier entries with this prefix, just go on.
				if (titles.length <= 0) {
					apiobj.params.numbering = apiobj.params.number = '';
				} else {
					var number = 0;
					for (var i = 0; i < titles.length; ++i) {
						var title = titles[i].getAttribute('title');

						// First, simple test, is there an instance with this exact name?
						if (title === 'వికీపీడియా:తొలగింపు కొరకు వ్యాసాలు/' + mw.config.get('wgPageName')) {
							number = Math.max(number, 1);
							continue;
						}

						var order_re = new RegExp('^' +
							RegExp.escape('వికీపీడియా:తొలగింపు కొరకు వ్యాసాలు/' + mw.config.get('wgPageName'), true) +
							'\\s*\\(\\s*(\\d+)(?:(?:th|nd|rd|st) nom(?:ination)?)?\\s*\\)\\s*$');
						var match = order_re.exec(title);

						// No match; A non-good value
						if (!match) {
							continue;
						}

						// A match, set number to the max of current
						number = Math.max(number, Number(match[1]));
					}
					apiobj.params.number = Twinkle.xfd.num2order(parseInt(number, 10) + 1);
					apiobj.params.numbering = number > 0 ? ' (' + apiobj.params.number + ' nomination)' : '';
				}
				apiobj.params.discussionpage = 'వికీపీడియా:తొలగింపు కొరకు వ్యాసాలు/' + mw.config.get('wgPageName') + apiobj.params.numbering;

				Morebits.status.info("తరువాతి చర్చ పేజీ", "[[" + apiobj.params.discussionpage + "]]");

				// Updating data for the action completed event
				Morebits.wiki.actionCompleted.redirect = apiobj.params.discussionpage;
				Morebits.wiki.actionCompleted.notice = "నామినేషను పూర్తయింది. ఇప్పుడు చర్చ పేజీకి తీసుకుపోతున్నాం";

				// Tagging article
				var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "వ్యాసానికి తొలగింపు ట్యాగు చేరుస్తున్నాం");
				wikipedia_page.setFollowRedirect(true); // should never be needed, but if the article is moved, we would want to follow the redirect
				wikipedia_page.setCallbackParameters(apiobj.params);
				wikipedia_page.load(Twinkle.xfd.callbacks.afd.taggingArticle);
			},
			// Tagging needs to happen before everything else: this means we can check if there is an AfD tag already on the page
			taggingArticle: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();
				var statelem = pageobj.getStatusElement();

				// Check for existing AfD tag, for the benefit of new page patrollers
				var textNoAfd = text.replace(/\{\{\s*(తొలగింపు కొరకు వ్యాసాలు\/dated|AfDM)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, "");
				if (text !== textNoAfd) {
					if (confirm("వ్యాసంలో ఈసరికే ఒక AfD ట్యాగు ఉంది. ఎవరో మీకంటే ముందు ఉన్నారు.  \nఆ ట్యాగు స్థానంలో మీ ట్యాగు ఉంచాలంటే OK నొక్కండి (కానీ, ఇది సరైన పద్ధతి కాదు). ఈ నామినేషన్ను ఆపేసేందుకు రద్దుచెయ్యి నొక్కండి.")) {
						text = textNoAfd;
					} else {
						statelem.error("వ్యాసంలో ఈసరికే ఒక AfD ట్యాగు ఉంది. అంచేత మీరు ఈ పనిని ఆపేసారు");
						window.location.reload();
						return;
					}
				}

				// Now we know we want to go ahead with it, trigger the other AJAX requests

				// Starting discussion page
				var wikipedia_page = new Morebits.wiki.page(params.discussionpage, "Creating article deletion discussion page");
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.xfd.callbacks.afd.discussionPage);

				// Today's list
				var date = new Date();
				wikipedia_page = new Morebits.wiki.page('వికీపీడియా:తొలగింపు కొరకు వ్యాసాలు/Log/' + date.getUTCFullYear() + ' ' +
					date.getUTCMonthName() + ' ' + date.getUTCDate(), "చర్చను జాబితా లోకి చేరుస్తున్నాం");
				wikipedia_page.setFollowRedirect(true);
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.xfd.callbacks.afd.todaysList);

				// Notification to first contributor
				if (params.usertalk) {
					var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
					thispage.setCallbackParameters(params);
					thispage.lookupCreator(Twinkle.xfd.callbacks.afd.userNotification);
				}

				// Remove some tags that should always be removed on AfD.
				text = text.replace(/\{\{\s*(dated prod|dated prod blp|Prod blp\/dated|Proposed deletion\/dated|prod2|Proposed deletion endorsed|New unreviewed article|Userspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");
				// Then, test if there are speedy deletion-related templates on the article.
				var textNoSd = text.replace(/\{\{\s*(db(-\w*)?|delete|(?:hang|hold)[\- ]?on)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, "");
				if (text !== textNoSd && confirm("వ్యాసంలో ఈసరికే ఒక సత్వర తొలగింపు ట్యాగు ఉంది. దాన్ని తీసెయ్యమంటారా?")) {
					text = textNoSd;
				}

				pageobj.setPageText((params.noinclude ? "<noinclude>{{" : "{{") + (params.number === '' ? "subst:afd|help=off" : ('subst:afdx|' +
					params.number + "|help=off")) + (params.noinclude ? "}}</noinclude>\n" : "}}\n") + text);
				pageobj.setEditSummary("తొలగింపుకు నామినేటు చేసారు; [[" + params.discussionpage + "]] చూడండి." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchPage')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('nocreate');
				pageobj.save();
			},
			discussionPage: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				pageobj.setPageText("{{subst:afd2|text=" + params.reason + " ~~~~|pg=" + mw.config.get('wgPageName') + "|cat=" + params.xfdcat + "}}\n");
				pageobj.setEditSummary("[[" + mw.config.get('wgPageName') + "]] కోసం తొలగింపు చర్చ పేజీని సృష్టిస్తున్నాం." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchDiscussion')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('createonly');
				pageobj.save(function() {
					Twinkle.xfd.currentRationale = null; // any errors from now on do not need to print the rationale, as it is safely saved on-wiki
				});
			},
			todaysList: function(pageobj) {
				var old_text = pageobj.getPageText() + "\n"; // MW strips trailing blanks, but we like them, so we add a fake one
				var params = pageobj.getCallbackParameters();
				var statelem = pageobj.getStatusElement();

				var text = old_text.replace(/(<\!-- Add new entries to the TOP of the following list -->\n+)/, "$1{{subst:afd3|pg=" + mw.config.get('wgPageName') + params.numbering + "}}\n");
				if (text === old_text) {
					statelem.error('చర్చ కోసం లక్ష్యం పేజీ స్థానం కనిపించలేదు');
					return;
				}
				pageobj.setPageText(text);
				pageobj.setEditSummary("Adding [[" + params.discussionpage + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchList')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate');
				pageobj.save();
			},
			userNotification: function(pageobj) {
				var params = pageobj.getCallbackParameters();
				var initialContrib = pageobj.getCreator();
				var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "తొలి రచయితకు తెలియపరుస్తున్నాం (" + initialContrib + ")");
				var notifytext = "\n{{subst:AFDWarning|1=" + mw.config.get('wgPageName') + (params.numbering !== '' ? '|order=&#32;' + params.numbering : '') + "}} ~~~~";
				usertalkpage.setAppendText(notifytext);
				usertalkpage.setEditSummary("గమనింపు: [["+ mw.config.get('wgPageName')  +"]] ను [[WP:AFD|తొలగింపు కొరకు వ్యాసాలు]] పేజీలోని జాబితాలో చేరుస్తున్నాం." + Twinkle.getPref('summaryAd'));
				usertalkpage.setCreateOption('recreate');
				switch (Twinkle.getPref('xfdWatchUser')) {
					case 'yes':
						usertalkpage.setWatchlist(true);
						break;
					case 'no':
						usertalkpage.setWatchlistFromPreferences(false);
						break;
					default:
						usertalkpage.setWatchlistFromPreferences(true);
						break;
				}
				usertalkpage.setFollowRedirect(true);
				usertalkpage.append();
			}
		},


		tfd: {
			taggingTemplate: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				pageobj.setPageText((params.noinclude ? "<noinclude>" : "") + "{{subst:template for discussion|help=off|" +
					(params.tfdinline ? "type=inline|" : "") + mw.config.get('wgTitle') + (params.noinclude ? "}}</noinclude>" : "}}\n") + text);
				pageobj.setEditSummary("తొలగింపు కొరకు నామినేటు చేసాం. చూడండి: [[" + params.logpage + "#" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchPage')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('nocreate');
				pageobj.save();
			},
			todaysList: function(pageobj) {
				var old_text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();
				var statelem = pageobj.getStatusElement();

				var text = old_text.replace('-->', "-->\n{{subst:tfd2|text=" + params.reason + " ~~~~|1=" + mw.config.get('wgTitle') + "}}");
				if (text === old_text) {
					statelem.error('చర్చ కోసం లక్ష్యం పేజీ స్థానం కనిపించలేదు');
					return;
				}
				pageobj.setPageText(text);
				pageobj.setEditSummary("Adding [[Template:" + mw.config.get('wgTitle') + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchDiscussion')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate');
				pageobj.save(function() {
					Twinkle.xfd.currentRationale = null; // any errors from now on do not need to print the rationale, as it is safely saved on-wiki
				});
			},
			userNotification: function(pageobj) {
				var initialContrib = pageobj.getCreator();
				var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "తొలి రచయితకు తెలియపరుస్తున్నాం (" + initialContrib + ")");
				var notifytext = "\n{{subst:tfdnotice|1=" + mw.config.get('wgTitle') + "}} ~~~~";
				usertalkpage.setAppendText(notifytext);
				usertalkpage.setEditSummary("గమనింపు: "+ mw.config.get('wgPageName')  +" ను [[WP:TFD|చర్చ కొరకు మూసలు]] పేజీలో నామినేషను చేస్తున్నాం." + Twinkle.getPref('summaryAd'));
				usertalkpage.setCreateOption('recreate');
				switch (Twinkle.getPref('xfdWatchUser')) {
					case 'yes':
						usertalkpage.setWatchlist(true);
						break;
					case 'no':
						usertalkpage.setWatchlistFromPreferences(false);
						break;
					default:
						usertalkpage.setWatchlistFromPreferences(true);
						break;
				}
				usertalkpage.setFollowRedirect(true);
				usertalkpage.append();
			}
		},


		mfd: {
			main: function(apiobj) {
				var xmlDoc = apiobj.responseXML;
				var titles = $(xmlDoc).find('allpages p');

				// There has been no earlier entries with this prefix, just go on.
				if (titles.length <= 0) {
					apiobj.params.numbering = apiobj.params.number = '';
					numbering = number = '';
				} else {
					var number = 0;
					for (var i = 0; i < titles.length; ++i) {
						var title = titles[i].getAttribute('title');

						// First, simple test, is there an instance with this exact name?
						if (title === 'వికీపీడియా:తొలగింపు కొరకు ఇతర పేజీలు/' + mw.config.get('wgPageName')) {
							number = Math.max(number, 1);
							continue;
						}

						var order_re = new RegExp('^' +
							RegExp.escape('వికీపీడియా:తొలగింపు కొరకు ఇతర పేజీలు/' + mw.config.get('wgPageName'), true) +
							'\\s*\\(\\s*(\\d+)(?:(?:th|nd|rd|st) nom(?:ination)?)?\\s*\\)\\s*$');
						var match = order_re.exec(title);

						// No match; A non-good value
						if (!match) {
							continue;
						}

						// A match, set number to the max of current
						number = Math.max(number, Number(match[1]));
					}
					apiobj.params.number = Twinkle.xfd.num2order(parseInt(number, 10) + 1);
					apiobj.params.numbering = number > 0 ? ' (' + apiobj.params.number + ' nomination)' : '';
				}
				apiobj.params.discussionpage = "వికీపీడియా:తొలగింపు కొరకు ఇతర పేజీలు/" + mw.config.get('wgPageName') + apiobj.params.numbering;

				apiobj.statelem.info("next in order is [[" + apiobj.params.discussionpage + ']]');

				// Tagging page
				var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "పేజీలో తొలగింపు ట్యాగును చేరుస్తున్నాం");
				wikipedia_page.setFollowRedirect(true); // should never be needed, but if the page is moved, we would want to follow the redirect
				wikipedia_page.setCallbackParameters(apiobj.params);
				wikipedia_page.load(Twinkle.xfd.callbacks.mfd.taggingPage);

				// Updating data for the action completed event
				Morebits.wiki.actionCompleted.redirect = apiobj.params.discussionpage;
				Morebits.wiki.actionCompleted.notice = "నామినేషను పూర్తయింది. ఇప్పుడు చర్చ పేజీకి తీసుకుపోతున్నాం";

				// Discussion page
				wikipedia_page = new Morebits.wiki.page(apiobj.params.discussionpage, "తొలగింపు చర్చ పేజీని సృష్టిస్తున్నాం");
				wikipedia_page.setCallbackParameters(apiobj.params);
				wikipedia_page.load(Twinkle.xfd.callbacks.mfd.discussionPage);

				// Today's list
				wikipedia_page = new Morebits.wiki.page("వికీపీడియా:తొలగింపు కొరకు ఇతర పేజీలు", "చర్చను జాబితా లోకి చేరుస్తున్నాం");
				//wikipedia_page.setPageSection(2);
				// pageSection has been disabled - the API seems to throw up with nonexistent edit conflicts
				// it can be turned on again once the problem is fixed, to save bandwidth
				//wikipedia_page.setFollowRedirect(true);
				wikipedia_page.setCallbackParameters(apiobj.params);
				wikipedia_page.load(Twinkle.xfd.callbacks.mfd.todaysList);

				// Notification to first contributor, and notification to owner of userspace (if applicable and required)
				if (apiobj.params.usertalk) {
					var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
					thispage.setCallbackParameters(apiobj.params);
					thispage.lookupCreator(Twinkle.xfd.callbacks.mfd.userNotification);
				}
			},
			taggingPage: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				pageobj.setPageText((params.noinclude ? "<noinclude>" : "") + "{{" + ((params.number === '') ? "mfd}}\n" : ('mfdx|' + params.number + "}}\n")) +
					(params.noinclude ? "</noinclude>" : "") + text);
				pageobj.setEditSummary("తొలగింపు కొరకు నామినేటు చేసాం. చూడండి: [[" + params.discussionpage + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchPage')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('nocreate');
				pageobj.save();
			},
			discussionPage: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				pageobj.setPageText("{{subst:mfd2|text=" + params.reason + " ~~~~|pg=" + mw.config.get('wgPageName') + "}}\n");
				pageobj.setEditSummary("[[" + mw.config.get('wgPageName') + "]] కోసం తొలగింపు చర్చ పేజీని సృష్టిస్తున్నాం." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchDiscussion')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('createonly');
				pageobj.save(function() {
					Twinkle.xfd.currentRationale = null; // any errors from now on do not need to print the rationale, as it is safely saved on-wiki
				});
			},
			todaysList: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();
				var statelem = pageobj.getStatusElement();

				var date = new Date();
				var date_header = "===" + date.getUTCMonthName() + ' ' + date.getUTCDate() + ', ' + date.getUTCFullYear() + "===\n";
				var date_header_regex = new RegExp("(===\\s*" + date.getUTCMonthName() + '\\s+' + date.getUTCDate() + ',\\s+' + date.getUTCFullYear() + "\\s*===)");
				var new_data = "{{subst:mfd3|pg=" + mw.config.get('wgPageName') + params.numbering + "}}";

				if (date_header_regex.test(text)) { // we have a section already
					statelem.info('ఈనాటి విభాగం కనబడింది. అందులో ఈ కొత్త ఎంట్రీని చేరుస్తున్నాం');
					text = text.replace(date_header_regex, "$1\n" + new_data);
				} else { // we need to create a new section
					statelem.info('ఈనాటి విభాగం లేదు, సృష్టిస్తున్నాం');
					text = text.replace("===", date_header + new_data + "\n\n===");
				}

				pageobj.setPageText(text);
				pageobj.setEditSummary("చేరుస్తున్నాం: [[" + params.discussionpage + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchList')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate');
				pageobj.save();
			},
			userNotification: function(pageobj) {
				var initialContrib = pageobj.getCreator();
				var params = pageobj.getCallbackParameters();

				// Really notify the creator
				Twinkle.xfd.callbacks.mfd.userNotificationMain(params, initialContrib, "తొలి రచయితకు తెలియపరుస్తున్నాం");

				// Also notify the user who owns the subpage if they are not the creator
				if (params.notifyuserspace) {
					var userspaceOwner = ((mw.config.get('wgTitle').indexOf('/') === -1) ? mw.config.get('wgTitle') : mw.config.get('wgTitle').substring(0, mw.config.get('wgTitle').indexOf('/')));
					if (userspaceOwner !== initialContrib) {
						Twinkle.xfd.callbacks.mfd.userNotificationMain(params, userspaceOwner, "వాడుకరి స్థలపు స్వంతదారుకు తెలియపరుస్తున్నాం");
					}
				}
			},
			userNotificationMain: function(params, initialContrib, actionName) {
				var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, actionName + " (" + initialContrib + ")");
				var notifytext = "\n{{subst:MFDWarning|1=" + mw.config.get('wgPageName') + (params.numbering !== '' ? '|order=&#32;' + params.numbering : '') + "}} ~~~~";
				usertalkpage.setAppendText(notifytext);
				usertalkpage.setEditSummary("గమనింపు: [[" + mw.config.get('wgPageName') + "]] ను [[WP:MFD|తొలగింపు కొరకు ఇతర పేజీలు]] లోని జాబితాలో చేరుస్తున్నాం." + Twinkle.getPref('summaryAd'));
				usertalkpage.setCreateOption('recreate');
				switch (Twinkle.getPref('xfdWatchUser')) {
					case 'yes':
						usertalkpage.setWatchlist(true);
						break;
					case 'no':
						usertalkpage.setWatchlistFromPreferences(false);
						break;
					default:
						usertalkpage.setWatchlistFromPreferences(true);
						break;
				}
				usertalkpage.setFollowRedirect(true);
				usertalkpage.append();
			}
		},


		ffd: {
			main: function(pageobj) {
				// this is coming in from lookupCreator...!
				var params = pageobj.getCallbackParameters();
				var initialContrib = pageobj.getCreator();
				params.uploader = initialContrib;

				// Adding discussion
				wikipedia_page = new Morebits.wiki.page(params.logpage, "చర్చను జాబితా లోకి చేరుస్తున్నాం");
				wikipedia_page.setFollowRedirect(true);
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.xfd.callbacks.ffd.todaysList);

				// Notification to first contributor
				if (params.usertalk) {
					var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "తొలి రచయితకు తెలియపరుస్తున్నాం: (" + initialContrib + ")");
					var notifytext = "\n{{subst:idw|1=" + mw.config.get('wgTitle') + "}}";
					usertalkpage.setAppendText(notifytext);
					usertalkpage.setEditSummary("గమనింపు: listing at [[WP:FFD|తొలగింపు కొరకు దస్త్రాలు]] of [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
					usertalkpage.setCreateOption('recreate');
					switch (Twinkle.getPref('xfdWatchUser')) {
						case 'yes':
							usertalkpage.setWatchlist(true);
							break;
						case 'no':
							usertalkpage.setWatchlistFromPreferences(false);
							break;
						default:
							usertalkpage.setWatchlistFromPreferences(true);
							break;
					}
					usertalkpage.setFollowRedirect(true);
					usertalkpage.append();
				}
			},
			taggingImage: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, "");

				pageobj.setPageText("{{ffd|log=" + params.date + "}}\n" + text);
				pageobj.setEditSummary("తొలగింపు కొరకు నామినేటు చేసాం. చూడండి: [[" + params.logpage + "#" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchPage')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate'); // it might be possible for a file to exist without a description page
				pageobj.save();
			},
			todaysList: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				// add date header if the log is found to be empty (a bot should do this automatically, but it sometimes breaks down)
				if (!pageobj.exists()) {
					text = "{{subst:Ffd log}}";
				}

				pageobj.setPageText(text + "\n{{subst:ffd2|Reason=" + params.reason + "|Uploader=" + params.uploader + "|1=" + mw.config.get('wgTitle') + "}} ~~~~");
				pageobj.setEditSummary("చేరుస్తున్నాం: [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchDiscussion')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate');
				pageobj.save(function() {
					Twinkle.xfd.currentRationale = null; // any errors from now on do not need to print the rationale, as it is safely saved on-wiki
				});
			}
		},


		puf: {
			taggingImage: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, "");

				pageobj.setPageText("{{puf|help=off|log=" + params.date + "}}\n" + text);
				pageobj.setEditSummary("Listed at [[WP:PUF|బహుశా ఉచితం కాని దస్త్రాలు]]: [[" + params.logpage + "#" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchPage')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate'); // it might be possible for a file to exist without a description page
				pageobj.save();
			},
			todaysList: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				pageobj.setPageText(text + "\n{{subst:puf2|reason=" + params.reason + "|image=" + mw.config.get('wgTitle') + "}} ~~~~");
				pageobj.setEditSummary("Adding [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchDiscussion')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate');
				pageobj.save(function() {
					Twinkle.xfd.currentRationale = null; // any errors from now on do not need to print the rationale, as it is safely saved on-wiki
				});
			},
			userNotification: function(pageobj) {
				var initialContrib = pageobj.getCreator();
				var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "తొలి రచయితకు తెలియపరుస్తున్నాం (" + initialContrib + ")");
				var notifytext = "\n{{subst:idw-puf|1=" + mw.config.get('wgTitle') + "}} ~~~~";
				usertalkpage.setAppendText(notifytext);
				usertalkpage.setEditSummary("గమనింపు: [[" + mw.config.get('wgPageName') + "]], [[WP:PUF|బహుశా ఉచితం కాని దస్త్రాలు]] పేజీలో చేర్పు." + Twinkle.getPref('summaryAd'));
				usertalkpage.setCreateOption('recreate');
				switch (Twinkle.getPref('xfdWatchUser')) {
					case 'yes':
						usertalkpage.setWatchlist(true);
						break;
					case 'no':
						usertalkpage.setWatchlistFromPreferences(false);
						break;
					default:
						usertalkpage.setWatchlistFromPreferences(true);
						break;
				}
				usertalkpage.setFollowRedirect(true);
				usertalkpage.append();
			}
		},


		cfd: {
			taggingCategory: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				var added_data = "";
				var editsummary = "";
				switch (params.xfdcat) {
					case 'cfd':
						added_data = "{{subst:cfd}}";
						editsummary = "ఈ వర్గం తొలగింపు ప్రతిపాదనలో ఉంది; చూడండి: [[" + params.logpage + "#" + mw.config.get('wgPageName') + "]].";
						break;
					case 'cfm':
						added_data = "{{subst:cfm|" + params.target + "}}";
						editsummary = "ఈ వర్గం విలీనం ప్రతిపాదనలో ఉంది; చూడండి: [[" + params.logpage + "#" + mw.config.get('wgPageName') + "]].";
						break;
					case 'cfr':
						added_data = "{{subst:cfr|" + params.target + "}}";
						editsummary = "ఈ వర్గం పేరుమార్పు ప్రతిపాదనలో ఉంది; చూడండి: [[" + params.logpage + "#" + mw.config.get('wgPageName') + "]].";
						break;
					case 'cfs':
						added_data = "{{subst:cfs|" + params.target + "|" + params.target2 + "}}";
						editsummary = "ఈ వర్గాన్ని విడదీసే ప్రతిపాదన ఉంది; చూడండి: [[" + params.logpage + "#" + mw.config.get('wgPageName') + "]].";
						break;
					case 'cfc':
						added_data = "{{subst:cfc|" + params.target + "}}";
						editsummary = "ఈ వర్గాన్ని వ్యాసంగా మార్చే ప్రతిపాదన ఉంది; చూడండి: [[" + params.logpage + "#" + mw.config.get('wgPageName') + "]].";
						break;
					default:
						alert("twinklexfd in taggingCategory(): unknown CFD action");
						break;
				}

				pageobj.setPageText(added_data + "\n" + text);
				pageobj.setEditSummary(editsummary + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchPage')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate'); // since categories can be populated without an actual page at that title
				pageobj.save();
			},
			todaysList: function(pageobj) {
				var old_text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();
				var statelem = pageobj.getStatusElement();

				var added_data = "";
				var editsummary = "";
				switch (params.xfdcat) {
					case 'cfd':
						added_data = "{{subst:cfd2|text=" + params.reason + " ~~~~|1=" + mw.config.get('wgTitle') + "}}";
						editsummary = "Added delete nomination of [[:" + mw.config.get('wgPageName') + "]].";
						break;
					case 'cfm':
						added_data = "{{subst:cfm2|text=" + params.reason + " ~~~~|1=" + mw.config.get('wgTitle') + "|2=" + params.target + "}}";
						editsummary = "Added merge nomination of [[:" + mw.config.get('wgPageName') + "]].";
						break;
					case 'cfr':
						added_data = "{{subst:cfr2|text=" + params.reason + " ~~~~|1=" + mw.config.get('wgTitle') + "|2=" + params.target + "}}";
						editsummary = "Added rename nomination of [[:" + mw.config.get('wgPageName') + "]].";
						break;
					case 'cfs':
						added_data = "{{subst:cfs2|text=" + params.reason + " ~~~~|1=" + mw.config.get('wgTitle') + "|2=" + params.target + "|3=" + params.target2 + "}}";
						editsummary = "Added split nomination of [[:" + mw.config.get('wgPageName') + "]].";
						break;
					case 'cfc':
						added_data = "{{subst:cfc2|text=" + params.reason + " ~~~~|1=" + mw.config.get('wgTitle') + "|2=" + params.target + "}}";
						editsummary = "Added convert nomination of [[:" + mw.config.get('wgPageName') + "]].";
						break;
					default:
						alert("twinklexfd in todaysList: unknown CFD action");
						break;
				}

				text = old_text.replace('below this line -->', "below this line -->\n" + added_data);
				if (text === old_text) {
					statelem.error('చర్చ కోసం లక్ష్యం పేజీ స్థానం కనిపించలేదు');
					return;
				}

				pageobj.setPageText(text);
				pageobj.setEditSummary(editsummary + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchDiscussion')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate');
				pageobj.save(function() {
					Twinkle.xfd.currentRationale = null; // any errors from now on do not need to print the rationale, as it is safely saved on-wiki
				});
			},
			userNotification: function(pageobj) {
				var initialContrib = pageobj.getCreator();
				var params = pageobj.getCallbackParameters();
				var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "తొలి రచయితకు తెలియపరుస్తున్నాం (" + initialContrib + ")");
				var notifytext = "\n{{subst:CFDNote|1=" + mw.config.get('wgPageName') + "}} ~~~~";
				usertalkpage.setAppendText(notifytext);
				usertalkpage.setEditSummary("గమనింపు: [[" + mw.config.get('wgPageName') + "]], [[వికీపీడియా:చర్చ కొరకు వర్గాలు|చర్చ కొరకు వర్గాలు]] లో చేర్పు." + Twinkle.getPref('summaryAd'));
				usertalkpage.setCreateOption('recreate');
				switch (Twinkle.getPref('xfdWatchUser')) {
					case 'yes':
						usertalkpage.setWatchlist(true);
						break;
					case 'no':
						usertalkpage.setWatchlistFromPreferences(false);
						break;
					default:
						usertalkpage.setWatchlistFromPreferences(true);
						break;
				}
				usertalkpage.setFollowRedirect(true);
				usertalkpage.append();
			}
		},


		cfds: {
			taggingCategory: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				pageobj.setPageText("{{subst:cfr-speedy|1=" + params.target + "}}\n" + text);
				pageobj.setEditSummary("Nominated for speedy renaming; see [[WP:CFDS|చర్చ కొరకు వర్గాలు/Speedy]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchPage')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate'); // since categories can be populated without an actual page at that title
				pageobj.save();
			},
			addToList: function(pageobj) {
				var old_text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();
				var statelem = pageobj.getStatusElement();

				var newcatname = (/^Category:/.test(params.target) ? params.target : ("వర్గం:" + params.target));
				text = old_text.replace('BELOW THIS LINE -->', "BELOW THIS LINE -->\n* [[:" + mw.config.get('wgPageName') + "]] to [[:" +
					newcatname + "]]\u00A0\u2013 " + params.xfdcat + (params.reason ? (": " + params.reason) : ".") + " ~~~~");
				// U+00A0 NO-BREAK SPACE; U+2013 EN RULE
				if (text === old_text) {
					statelem.error('చర్చ కోసం లక్ష్యం పేజీ స్థానం కనిపించలేదు');
					return;
				}

				pageobj.setPageText(text);
				pageobj.setEditSummary("Adding [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchDiscussion')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate');
				pageobj.save(function() {
					Twinkle.xfd.currentRationale = null; // any errors from now on do not need to print the rationale, as it is safely saved on-wiki
				});
			}
		},


		rfd: {
			// This is a callback from an API request, which gets the target of the redirect
			findTargetCallback: function(apiobj) {
				var xmlDoc = apiobj.responseXML;
				var target = $(xmlDoc).find('redirects r').first().attr('to');
				if (!target) {
					apiobj.statelem.error("ఈ పేజీ ప్రస్తుతం దారిమార్పు కాదు, ఆపేస్తున్నాం");
					return;
				}
				apiobj.params.target = target;
				Twinkle.xfd.callbacks.rfd.main(apiobj.params);
			},
			main: function(params) {
				var date = new Date();
				params.logpage = 'వికీపీడియా:Redirects for discussion/Log/' + date.getUTCFullYear() + ' ' + date.getUTCMonthName() + ' ' + date.getUTCDate();

				// Tagging redirect
				var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "దారిమార్పుకు తొలగింపు ట్యాగును చేరుస్తున్నాం");
				wikipedia_page.setFollowRedirect(false);
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.xfd.callbacks.rfd.taggingRedirect);

				// Updating data for the action completed event
				Morebits.wiki.actionCompleted.redirect = params.logpage;
				Morebits.wiki.actionCompleted.notice = "నామినేషను పూర్తయింది. ఇప్పుడు చర్చ పేజీకి తీసుకుపోతున్నాం";

				// Adding discussion
				wikipedia_page = new Morebits.wiki.page(params.logpage, "Adding discussion to today's log");
				wikipedia_page.setFollowRedirect(true);
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.xfd.callbacks.rfd.todaysList);

				// Notifying initial contributor
				if (params.usertalk) {
					var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
					thispage.setCallbackParameters(params);
					thispage.lookupCreator(Twinkle.xfd.callbacks.rfd.userNotification);
				}
			},
			taggingRedirect: function(pageobj) {
				var text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();

				pageobj.setPageText("{{subst:rfd}}\n" + text);
				pageobj.setEditSummary("Listed for discussion at [[" + params.logpage + "#" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchPage')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('nocreate');
				pageobj.save();
			},
			todaysList: function(pageobj) {
				var old_text = pageobj.getPageText();
				var params = pageobj.getCallbackParameters();
				var statelem = pageobj.getStatusElement();

				var text = old_text.replace(/(<\!-- Add new entries directly below this line -->)/, "$1\n{{subst:rfd2|text=" + Morebits.string.toUpperCaseFirstChar(params.reason) + "|redirect=" + mw.config.get('wgPageName') + "|target=" +
					params.target + "}} ~~~~\n");
				if (text === old_text) {
					statelem.error('చర్చ కోసం లక్ష్యం పేజీ స్థానం కనిపించలేదు');
					return;
				}

				pageobj.setPageText(text);
				pageobj.setEditSummary("Adding [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
				switch (Twinkle.getPref('xfdWatchDiscussion')) {
					case 'yes':
						pageobj.setWatchlist(true);
						break;
					case 'no':
						pageobj.setWatchlistFromPreferences(false);
						break;
					default:
						pageobj.setWatchlistFromPreferences(true);
						break;
				}
				pageobj.setCreateOption('recreate');
				pageobj.save(function() {
					Twinkle.xfd.currentRationale = null; // any errors from now on do not need to print the rationale, as it is safely saved on-wiki
				});
			},
			userNotification: function(pageobj) {
				var initialContrib = pageobj.getCreator();
				var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, "తొలి రచయితకు తెలియపరుస్తున్నాం (" + initialContrib + ")");
				var notifytext = "\n{{subst:RFDNote|1=" + mw.config.get('wgPageName') + "}} ~~~~";
				usertalkpage.setAppendText(notifytext);
				usertalkpage.setEditSummary("Notification: listing at [[WP:RFD|redirects for discussion]] of [[" + mw.config.get('wgPageName') + "]]." + Twinkle.getPref('summaryAd'));
				usertalkpage.setCreateOption('recreate');
				switch (Twinkle.getPref('xfdWatchUser')) {
					case 'yes':
						usertalkpage.setWatchlist(true);
						break;
					case 'no':
						usertalkpage.setWatchlistFromPreferences(false);
						break;
					default:
						usertalkpage.setWatchlistFromPreferences(true);
						break;
				}
				usertalkpage.setFollowRedirect(true);
				usertalkpage.append();
			}
		}
	};



	Twinkle.xfd.callback.evaluate = function(e) {
		mw.config.set('wgPageName', mw.config.get('wgPageName').replace(/_/g, ' ')); // for queen/king/whatever and country!

		var type = e.target.category.value;
		var usertalk = e.target.notify.checked;
		var reason = e.target.xfdreason.value;
		var xfdcat, xfdtarget, xfdtarget2, puf, noinclude, tfdinline, notifyuserspace;
		if (type === "afd" || type === "cfd" || type === "cfds") {
			xfdcat = e.target.xfdcat.value;
		}
		if (type === "cfd" || type === "cfds") {
			xfdtarget = e.target.xfdtarget.value;
			if (e.target.xfdtarget2) {
				xfdtarget2 = e.target.xfdtarget2.value;
			}
		}
		if (type === 'ffd') {
			puf = e.target.puf.checked;
		}
		if (type === "afd" || type === "mfd" || type === "tfd") {
			noinclude = e.target.noinclude.checked;
		}
		if (type === 'tfd') {
			tfdinline = e.target.tfdinline.checked;
		}
		if (type === 'mfd') {
			notifyuserspace = e.target.notifyuserspace && e.target.notifyuserspace.checked;
		}

		Morebits.simpleWindow.setButtonsEnabled(false);
		Morebits.status.init(e.target);

		Twinkle.xfd.currentRationale = reason;
		Morebits.status.onError(Twinkle.xfd.printRationale);

		if (!type) {
			Morebits.status.error('Error', 'no action given');
			return;
		}

		var query, wikipedia_page, wikipedia_api, logpage, params;
		var date = new Date();
		switch (type) {

			case 'afd': // AFD
				query = {
					'action': 'query',
					'list': 'allpages',
					'apprefix': 'తొలగింపు కొరకు వ్యాసాలు/' + mw.config.get('wgPageName'),
					'apnamespace': 4,
					'apfilterredir': 'nonredirects',
					'aplimit': Morebits.userIsInGroup('sysop') ? 5000 : 500
				};
				wikipedia_api = new Morebits.wiki.api('వ్యాసంలో తొలగింపు ట్యాగును పెడుతున్నాం', query, Twinkle.xfd.callbacks.afd.main);
				wikipedia_api.params = {
					usertalk: usertalk,
					reason: reason,
					noinclude: noinclude,
					xfdcat: xfdcat
				};
				wikipedia_api.post();
				break;

			case 'tfd': // TFD
				Morebits.wiki.addCheckpoint();

				logpage = 'వికీపీడియా:చర్చ కొరకు మూసలు/Log/' + date.getUTCFullYear() + ' ' + date.getUTCMonthName() + ' ' + date.getUTCDate();

				// Tagging template
				wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "మూసలో తొలగింపు ట్యాగును పెడుతున్నాం");
				wikipedia_page.setFollowRedirect(true); // should never be needed, but if the page is moved, we would want to follow the redirect
				wikipedia_page.setCallbackParameters({
					tfdinline: tfdinline,
					logpage: logpage,
					noinclude: noinclude
				});
				wikipedia_page.load(Twinkle.xfd.callbacks.tfd.taggingTemplate);

				// Updating data for the action completed event
				Morebits.wiki.actionCompleted.redirect = logpage;
				Morebits.wiki.actionCompleted.notice = "నామినేషను పూర్తయింది. ఇప్పుడు చర్చ పేజీకి తీసుకుపోతున్నాం";

				// Adding discussion
				wikipedia_page = new Morebits.wiki.page(logpage, "చర్చను జాబితా లోకి చేరుస్తున్నాం");
				wikipedia_page.setFollowRedirect(true);
				wikipedia_page.setCallbackParameters({
					reason: reason
				});
				wikipedia_page.load(Twinkle.xfd.callbacks.tfd.todaysList);

				// Notification to first contributor
				if (usertalk) {
					var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
					thispage.lookupCreator(Twinkle.xfd.callbacks.tfd.userNotification);
				}

				Morebits.wiki.removeCheckpoint();
				break;

			case 'mfd': // MFD
				query = {
					'action': 'query',
					'list': 'allpages',
					'apprefix': 'తొలగింపు కొరకు ఇతర పేజీలు/' + mw.config.get('wgPageName'),
					'apnamespace': 4,
					'apfilterredir': 'nonredirects',
					'aplimit': Morebits.userIsInGroup('sysop') ? 5000 : 500
				};
				wikipedia_api = new Morebits.wiki.api("ఈ పేజీకి గతంలో నామినేషన్లున్లేమైనా ఉన్నాయేమో చూస్తున్నాం", query, Twinkle.xfd.callbacks.mfd.main);
				wikipedia_api.params = {
					usertalk: usertalk,
					notifyuserspace: notifyuserspace,
					reason: reason,
					noinclude: noinclude,
					xfdcat: xfdcat
				};
				wikipedia_api.post();
				break;

			case 'ffd': // FFD
				var dateString = date.getUTCFullYear() + ' ' + date.getUTCMonthName() + ' ' + date.getUTCDate();
				logpage = 'వికీపీడియా:తొలగింపు కొరకు దస్త్రాలు/' + dateString;
				params = {
					usertalk: usertalk,
					reason: reason,
					date: dateString,
					logpage: logpage
				};

				Morebits.wiki.addCheckpoint();
				if (puf) {
					params.logpage = logpage = 'వికీపీడియా:Possibly unfree files/' + dateString;

					// Updating data for the action completed event
					Morebits.wiki.actionCompleted.redirect = logpage;
					Morebits.wiki.actionCompleted.notice = "నామినేషను పూర్తయింది. ఇప్పుడు నేటి జాబితాకు తీసుకుపోతున్నాం";

					// Tagging file
					wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "దస్త్రానికి PUF ట్యాగును చేరుస్తున్నాం");
					wikipedia_page.setFollowRedirect(true);
					wikipedia_page.setCallbackParameters(params);
					wikipedia_page.load(Twinkle.xfd.callbacks.puf.taggingImage);

					// Adding discussion
					wikipedia_page = new Morebits.wiki.page(params.logpage, "చర్చను జాబితా లోకి చేరుస్తున్నాం");
					wikipedia_page.setFollowRedirect(true);
					wikipedia_page.setCallbackParameters(params);
					wikipedia_page.load(Twinkle.xfd.callbacks.puf.todaysList);

					// Notification to first contributor
					if (usertalk) {
						wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'));
						wikipedia_page.setCallbackParameters(params);
						wikipedia_page.lookupCreator(Twinkle.xfd.callbacks.puf.userNotification);
					}

					Morebits.wiki.removeCheckpoint();

				} else {
					// Updating data for the action completed event
					Morebits.wiki.actionCompleted.redirect = logpage;
					Morebits.wiki.actionCompleted.notice = "నామినేషను పూర్తయింది. ఇప్పుడు చర్చ పేజీకి తీసుకుపోతున్నాం";

					// Tagging file
					wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "దస్త్రం పేజీకి తొలగింపు ట్యాగును చేరుస్తున్నాం");
					wikipedia_page.setFollowRedirect(true);
					wikipedia_page.setCallbackParameters(params);
					wikipedia_page.load(Twinkle.xfd.callbacks.ffd.taggingImage);

					// Contributor specific edits
					wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'));
					wikipedia_page.setCallbackParameters(params);
					wikipedia_page.lookupCreator(Twinkle.xfd.callbacks.ffd.main);
				}
				Morebits.wiki.removeCheckpoint();
				break;

			case 'cfd':
				Morebits.wiki.addCheckpoint();

				if (xfdtarget) {
					xfdtarget = xfdtarget.replace(/^\:?Category\:/i, '');
				} else {
					xfdtarget = '';
				}

				if (xfdtarget2) {
					xfdtarget2 = xfdtarget2.replace(/^\:?Category\:/i, '');
				}

				logpage = 'వికీపీడియా:చర్చ కొరకు వర్గాలు/Log/' + date.getUTCFullYear() + ' ' + date.getUTCMonthName() + ' ' + date.getUTCDate();

				params = {
					reason: reason,
					xfdcat: xfdcat,
					target: xfdtarget,
					target2: xfdtarget2,
					logpage: logpage
				};

				// Updating data for the action completed event
				Morebits.wiki.actionCompleted.redirect = logpage;
				Morebits.wiki.actionCompleted.notice = "నామినేషను పూర్తయింది. ఇప్పుడు నేటి చిట్టాకు తీసుకుపోతున్నాం";

				// Tagging category
				wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "వర్గానికి తొలగింపు ట్యాగును చేరుస్తున్నాం");
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.xfd.callbacks.cfd.taggingCategory);

				// Adding discussion to list
				wikipedia_page = new Morebits.wiki.page(logpage, "చర్చను జాబితా లోకి చేరుస్తున్నాం");
				//wikipedia_page.setPageSection(2);
				// pageSection has been disabled - the API seems to throw up with nonexistent edit conflicts
				// it can be turned on again once the problem is fixed, to save bandwidth
				//wikipedia_page.setFollowRedirect(true);
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.xfd.callbacks.cfd.todaysList);

				// Notification to first contributor
				if (usertalk) {
					wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'));
					wikipedia_page.setCallbackParameters(params);
					wikipedia_page.lookupCreator(Twinkle.xfd.callbacks.cfd.userNotification);
				}

				Morebits.wiki.removeCheckpoint();
				break;

			case 'cfds':
				xfdtarget = xfdtarget.replace(/^\:?Category\:/, '');

				logpage = "వికీపీడియా:చర్చ కొరకు వర్గాలు/Speedy";
				params = {
					reason: reason,
					xfdcat: xfdcat,
					target: xfdtarget
				};

				// Updating data for the action completed event
				Morebits.wiki.actionCompleted.redirect = logpage;
				Morebits.wiki.actionCompleted.notice = "నామినేషను పూర్తయింది. ఇప్పుడు చర్చ పేజీకి తీసుకుపోతున్నాం";

				// Tagging category
				wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "వర్గానికి పేరుమార్పు ట్యాగును పెడుతున్నాం");
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.xfd.callbacks.cfds.taggingCategory);

				// Adding discussion to list
				wikipedia_page = new Morebits.wiki.page(logpage, "చర్చను జాబితా లోకి చేరుస్తున్నాం");
				wikipedia_page.setCallbackParameters(params);
				wikipedia_page.load(Twinkle.xfd.callbacks.cfds.addToList);

				break;

			case 'rfd':
				params = {
					usertalk: usertalk,
					reason: reason
				};
				if (document.getElementById("softredirect")) {
					// For soft redirects, skip straight to the callback
					params.target = document.getElementById("softredirect").textContent.replace(/^\:+/, "");
					Twinkle.xfd.callbacks.rfd.main(params);
				} else {
					// Find current target of redirect
					query = {
						'action': 'query',
						'titles': mw.config.get('wgPageName'),
						'redirects': true
					};
					wikipedia_api = new Morebits.wiki.api("Finding target of redirect", query, Twinkle.xfd.callbacks.rfd.findTargetCallback);
					wikipedia_api.params = params;
					wikipedia_api.post();
				}
				break;
			default:
				alert("twinklexfd: unknown XFD discussion venue");
				break;
		}
	};

	/**
	 * General initialization code
	 */

	var scriptpathbefore = mw.util.wikiScript("index") + "?title=",
		scriptpathafter = "&action=raw&ctype=text/javascript&happy=yes";

	// Retrieve the user's Twinkle preferences
	$.ajax({
		url: scriptpathbefore + "User:" + encodeURIComponent(mw.config.get("wgUserName")) + "/twinkleoptions.js" + scriptpathafter,
		dataType: "text",
		error: function() {
			mw.notify("twinkleoptions.js ను లోడు చెయ్యలేకపోయాం");
		},
		success: function(optionsText) {

			// Quick pass if user has no options
			if (optionsText === "") {
				return;
			}

			// Twinkle options are basically a JSON object with some comments. Strip those:
			optionsText = optionsText.replace(/(?:^(?:\/\/[^\n]*\n)*\n*|(?:\/\/[^\n]*(?:\n|$))*$)/g, "");

			// First version of options had some boilerplate code to make it eval-able -- strip that too. This part may become obsolete down the line.
			if (optionsText.lastIndexOf("window.Twinkle.prefs = ", 0) === 0) {
				optionsText = optionsText.replace(/(?:^window.Twinkle.prefs = |;\n*$)/g, "");
			}

			try {
				var options = JSON.parse(optionsText);

				// Assuming that our options evolve, we will want to transform older versions:
				//if ( options.optionsVersion === undefined ) {
				// ...
				// options.optionsVersion = 1;
				//}
				//if ( options.optionsVersion === 1 ) {
				// ...
				// options.optionsVersion = 2;
				//}
				// At the same time, twinkleconfig.js needs to be adapted to write a higher version number into the options.

				if (options) {
					Twinkle.prefs = options;
				}
			} catch (e) {
				mw.notify("twinkleoptions.js ను పార్స్ చెయ్యలేకపోయాం");
			}
		},
		complete: function() {
			$(Twinkle.load);
		}
	});

	// Developers: you can import custom Twinkle modules here
	// For example, mw.loader.load(scriptpathbefore + "User:UncleDouggie/morebits-test.js" + scriptpathafter);

	Twinkle.load = function() {
		// Don't activate on special pages other than "Contributions" so that they load faster, especially the watchlist.
		// Also, Twinkle is incompatible with Internet Explorer versions 8 or lower, so don't load there either.
		if ((mw.config.get('wgNamespaceNumber') === -1 && mw.config.get('wgCanonicalSpecialPageName') !== "Contributions" && mw.config.get('wgCanonicalSpecialPageName') !== "Prefixindex") ||
			($.client.profile().name === 'msie' && $.client.profile().versionNumber < 9)) {
			return;
		}

		// Load the modules in the order that the tabs should appears
		// User/user talk-related
		Twinkle.arv();
		Twinkle.warn();
		Twinkle.welcome();
		if (Morebits.userIsInGroup('sysop')) {
		Twinkle.block();
		}
		Twinkle.shared();
		Twinkle.talkback();
		// Deletion
		Twinkle.speedy();
		Twinkle.prod();
		Twinkle.xfd();
		Twinkle.image();
		// Maintenance
		Twinkle.protect();
		Twinkle.tag();
		// Misc. ones last
		Twinkle.diff();
		Twinkle.unlink();
		Twinkle.config.init();
		Twinkle.fluff.init();
		if (Morebits.userIsInGroup('sysop')) {
			Twinkle.delimages();
			Twinkle.deprod();
			Twinkle.batchdelete();
			Twinkle.batchprotect();
			Twinkle.batchundelete();
		}
		// Run the initialization callbacks for any custom modules
		$(Twinkle.initCallbacks).each(function(k, v) {
			v();
		});
		Twinkle.addInitCallback = function(func) {
			func();
		};

		// Increases text size in Twinkle dialogs, if so configured
		if (Twinkle.getPref("dialogLargeFont")) {
			mw.util.addCSS(".morebits-dialog-content, .morebits-dialog-footerlinks { font-size: 100% !important; } " +
				".morebits-dialog input, .morebits-dialog select, .morebits-dialog-content button { font-size: inherit !important; }");
		}
	};

}(window, document, jQuery)); // End wrap with anonymous function

// </nowiki>