local p = {}  local contrastRatio = require('Module:Color contrast')._ratio  function __genOrderedIndex(t)     local orderedIndex = {}     for key in pairs(t) do         table.insert(orderedIndex, key)     end     table.sort(orderedIndex)     return orderedIndex end  function orderedNext(t, state)     -- Equivalent of the next function, but returns the keys in the alphabetic     -- order. We use a temporary ordered key table that is stored in the     -- table being iterated.      local key = nil     if state == nil then         -- the first time, generate the index         t.__orderedIndex = __genOrderedIndex(t)         key = t.__orderedIndex[1]     else         -- fetch the next value         for i = 1, #(t.__orderedIndex) do             if t.__orderedIndex[i] == state then                 key = t.__orderedIndex[i + 1]             end         end     end      if key then         return key, t[key]     end      -- no more value to return, cleanup     t.__orderedIndex = nil     return end  function orderedPairs(t)     -- Equivalent of the pairs() function on tables. Allows to iterate in order.     return orderedNext, t, nil end  local function isContrastValid(text, background) 	if not background or background == "" then 		return 	end  	local ratio = tonumber(contrastRatio({text, background})) 	if not ratio then 		return "" 	end 	if ratio > 4.5 and ratio < 7.0 then 		return "কক" 	elseif ratio > 7.0 then 		return "ককক" 	else 		return "ব্যর্থ" 	end end  local function isColorValid(color) 	if not color or color == "" then 		return  	end  	-- Convert to lowercase. 	color = color:lower() 	 	-- Check if color is using an HTML color name. 	local HTMLcolor = mw.loadData('Module:Color contrast/colors') 	if HTMLcolor[color] then 		return 	end 	 	-- Added as a valid color in https://www.w3.org/TR/css-color-3/#transparent 	if color == "transparent" then 		return "" 	end  	-- Remove leading # if there is one. 	color = string.gsub(color, "^#", "")  	local cs = mw.text.split(color, ) 	if #cs == 6 or #cs == 3 then 		return 	end  	return false end  -- Example of having all the data - color and names - in one table. Requires one page to be edited instead of two when adding a new party. function p.tables(frame) 	-- Initialise and populate variables 	local args = frame.args 	local index = args.letter 	 	-- Load data from submodule 	local data = require('মডিউল:রাজনৈতিক দল/' .. index) 	 	-- helper function 	local function table_row(party_name, party_info) 		local res = mw.html.create() 		res:tag('th') 			:attr('scope', 'row') 			:wikitext(party_name) 		res:tag('td') 			:css('background-color', party_info.color) 			:wikitext(party_info.color) 		res:tag('td') 			:wikitext(party_info.abbrev) 		res:tag('td') 			:wikitext(party_info.shortname) 		res:tag('td') 			:wikitext(tostring(isColorValid(party_info.color))) 		res:tag('td') 			:wikitext(isContrastValid("black", party_info.color)) 		res:tag('td') 			:wikitext(isContrastValid("#0645AD", party_info.color)) 		res:tag('td') 			:wikitext(isContrastValid("#0B0080", party_info.color))  		return tostring(res) 	end  	-- build table 	local root = mw.html.create('table') 	root:addClass('wikitable') 		:addClass('sortable') 		:addClass('plainrowheaders') 		:css('background-color', 'transparent') 		:css('font-size', '90%') 		:css('line-height', '100%') 		:cssText(style) 	local row = root:tag('tr') 	row:tag('th') 		:attr('scope', 'col') 		:wikitext('রাজনৈতিক দলের নাম') 	row:tag('th') 		:attr('scope', 'col') 		:addClass('unsortable') 		:wikitext('রং') 	row:tag('th') 		:attr('scope', 'col') 		:wikitext('সংক্ষেপন') 	row:tag('th') 		:attr('scope', 'col') 		:wikitext('সংক্ষিপ্ত নাম') 	row:tag('th') 		:attr('scope', 'col') 		:wikitext('রঙটি বৈধ?') 	row:tag('th') 		:attr('scope', 'col') 		:wikitext('সাধারণ পাঠ্যের তুলনা') 	row:tag('th') 		:attr('scope', 'col') 		:wikitext('অপরিদর্শিত লিঙ্কের তুলনা') 	row:tag('th') 		:attr('scope', 'col') 		:wikitext('পরিদর্শিত লিঙ্কের তুলনা')  	for party_name, party_vals in orderedPairs(data.full) do 		row = root:tag('tr') 		row:wikitext(table_row(party_name, party_vals)) 	end 	return tostring(root)  end  return p