<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ta">
	<id>https://wiki1.tamilar.wiki/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AMedical_cases_chart</id>
	<title>Module:Medical cases chart - திருத்த வரலாறு</title>
	<link rel="self" type="application/atom+xml" href="https://wiki1.tamilar.wiki/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AMedical_cases_chart"/>
	<link rel="alternate" type="text/html" href="https://wiki1.tamilar.wiki/w/index.php?title=Module:Medical_cases_chart&amp;action=history"/>
	<updated>2026-06-05T03:30:23Z</updated>
	<subtitle>விக்கியில் இப்பக்கத்துக்கான திருத்த வரலாறு</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://wiki1.tamilar.wiki/w/index.php?title=Module:Medical_cases_chart&amp;diff=229486&amp;oldid=prev</id>
		<title>imported&gt;Aswn: *திருத்தம்*</title>
		<link rel="alternate" type="text/html" href="https://wiki1.tamilar.wiki/w/index.php?title=Module:Medical_cases_chart&amp;diff=229486&amp;oldid=prev"/>
		<updated>2021-04-09T11:38:37Z</updated>

		<summary type="html">&lt;p&gt;*திருத்தம்*&lt;/p&gt;
&lt;p&gt;&lt;b&gt;புதிய பக்கம்&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local barBox = require(&amp;#039;Module:Bar box&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local lang = mw.getContentLanguage()&lt;br /&gt;
local language = lang:getCode()&lt;br /&gt;
local i18n = require(&amp;#039;Module:Medical cases chart/i18n&amp;#039;)[language]&lt;br /&gt;
assert(i18n, &amp;#039;no chart translations to: &amp;#039; .. mw.language.fetchLanguageName(language, &amp;#039;ta&amp;#039;))&lt;br /&gt;
local monthAbbrs = {}&lt;br /&gt;
for i = 1, 12 do&lt;br /&gt;
	monthAbbrs[i] = lang:formatDate(&amp;#039;M&amp;#039;, &amp;#039;2020-&amp;#039; .. (&amp;#039;%02d&amp;#039;):format(i))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._toggleButton(active, customtoggles, id, label)&lt;br /&gt;
	local on  = active and &amp;#039;&amp;#039; or &amp;#039; mw-collapsed&amp;#039;&lt;br /&gt;
	local off = active and &amp;#039; mw-collapsed&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
	local outString =&lt;br /&gt;
		&amp;#039;&amp;lt;span class=&amp;quot;mw-collapsible&amp;#039; .. on  .. customtoggles .. &amp;#039;&amp;quot; id=&amp;quot;mw-customcollapsible-&amp;#039; .. id .. &amp;#039;&amp;quot; &amp;#039; ..&lt;br /&gt;
		&amp;#039;style=&amp;quot;border:2px solid lightblue&amp;quot;&amp;gt;&amp;#039; .. label .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;span class=&amp;quot;mw-collapsible&amp;#039; .. off .. customtoggles .. &amp;#039;&amp;quot; id=&amp;quot;mw-customcollapsible-&amp;#039; .. id .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. label  .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	return outString&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._yearToggleButton(year)&lt;br /&gt;
	return p._toggleButton(year.l, &amp;#039; mw-customtoggle-&amp;#039; .. year.year, year.year, year.year)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._monthToggleButton(year, month)&lt;br /&gt;
	local lmon, label = lang:lc(month.mon), month.mon&lt;br /&gt;
	local id = (year or &amp;#039;&amp;#039;) .. lmon&lt;br /&gt;
	local customtoggles = &amp;#039; mw-customtoggle-&amp;#039; .. id&lt;br /&gt;
&lt;br /&gt;
	if month.s then&lt;br /&gt;
		label = label .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. month.s -- &amp;quot;Mmm ##&amp;quot;&lt;br /&gt;
		if month.s ~= month.e then -- &amp;quot;Mmm ##–##&amp;quot;&lt;br /&gt;
			label = label .. &amp;#039;–&amp;#039; .. month.e&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		customtoggles = customtoggles .. (month.l and customtoggles .. month.l or &amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i, combination in ipairs(month.combinations) do&lt;br /&gt;
		customtoggles = customtoggles .. &amp;#039; mw-customtoggle-&amp;#039; .. combination -- up to 2 combinations per month so no need to table.concat()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p._toggleButton(false, customtoggles, id, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._lastXToggleButton(years, duration, combinationsL)&lt;br /&gt;
	local months, id = years[#years].months, &amp;#039;l&amp;#039; .. duration&lt;br /&gt;
	local i, customtoggles = #months, {&amp;#039; mw-customtoggle-&amp;#039; .. id}&lt;br /&gt;
&lt;br /&gt;
	if #years &amp;gt; 1 then&lt;br /&gt;
		local year = years[#years].year&lt;br /&gt;
		while months[i].l do&lt;br /&gt;
			customtoggles[#customtoggles+1] = &amp;#039; mw-customtoggle-&amp;#039; .. year .. lang:lc(months[i].mon) .. &amp;#039;-&amp;#039; .. id&lt;br /&gt;
			if i == 1 then&lt;br /&gt;
				if year == years[#years].year then&lt;br /&gt;
					year = years[#years-1].year&lt;br /&gt;
					months = years[#years-1].months&lt;br /&gt;
					i = #months&lt;br /&gt;
				else -- either first month is also lastX month or lastX spans more than 2 years, which is not intended yet&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				i = i - 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		while i &amp;gt; 0 and months[i].l do&lt;br /&gt;
			customtoggles[#customtoggles+1] = &amp;#039; mw-customtoggle-&amp;#039; .. lang:lc(months[i].mon) .. &amp;#039;-&amp;#039; .. id&lt;br /&gt;
			i = i - 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i, combinationL in ipairs(combinationsL) do&lt;br /&gt;
		customtoggles[#customtoggles+1] = &amp;#039; mw-customtoggle-&amp;#039; .. combinationL -- up to 3 combinationsL in 90 days&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p._toggleButton(true, table.concat(customtoggles), id, mw.ustring.format(i18n.lastXDays, duration))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._buildTogglesBar(dateList, duration, nooverlap)&lt;br /&gt;
	local years = {{year=dateList[1].year, months={{mon=dateList[1].mon, combinations={}}}}}&lt;br /&gt;
	local months, combinationsL = years[1].months, {}&lt;br /&gt;
&lt;br /&gt;
	local function addMonth(month)&lt;br /&gt;
		if month.mon ~= months[#months].mon then -- new month&lt;br /&gt;
			if month.year ~= years[#years].year then -- new year&lt;br /&gt;
				years[#years+1] = {year=month.year, months={}}&lt;br /&gt;
				months = years[#years].months -- switch months list&lt;br /&gt;
			end&lt;br /&gt;
			months[#months+1] = {mon=month.mon, combinations={}}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i = 2, #dateList do -- deduplicate years and months&lt;br /&gt;
		if #dateList[i] == 0 then -- specific date&lt;br /&gt;
			addMonth(dateList[i])&lt;br /&gt;
			months[#months].l = months[#months].l or dateList[i].l -- so that both ...-mon and ...-mon-lX classes are created&lt;br /&gt;
		elseif #dateList[i] == 1 then -- interval within month&lt;br /&gt;
			addMonth(dateList[i][1])&lt;br /&gt;
			months[#months].l = months[#months].l or dateList[i].l&lt;br /&gt;
		else -- multimonth interval&lt;br /&gt;
			for j, month in ipairs(dateList[i]) do&lt;br /&gt;
				addMonth(month)&lt;br /&gt;
				months[#months].combinations[#months[#months].combinations+1] = dateList[i].id&lt;br /&gt;
			end&lt;br /&gt;
			combinationsL[#combinationsL+1] = dateList[i].id:find(&amp;#039;-l%d+$&amp;#039;) and dateList[i].id&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if nooverlap then&lt;br /&gt;
		local lastDate = dateList[#dateList]&lt;br /&gt;
		months[#months].e = tonumber(os.date(&amp;#039;%d&amp;#039;, lastDate.nDate or lastDate.nEndDate or lastDate.nAltEndDate)) -- end of final month&lt;br /&gt;
&lt;br /&gt;
		local i = #dateList&lt;br /&gt;
		repeat&lt;br /&gt;
			i = i - 1&lt;br /&gt;
		until i == 0 or (dateList[i].mon or dateList[i][1].mon) ~= months[#months].mon&lt;br /&gt;
		if i == 0 then -- start of first and final month&lt;br /&gt;
			months[#months].s = tonumber(os.date(&amp;#039;%d&amp;#039;, dateList[1].nDate))&lt;br /&gt;
		else&lt;br /&gt;
			months[#months].s = 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	years[#years].l = true -- to activate toggle and respective months bar&lt;br /&gt;
&lt;br /&gt;
	local monthToggles, divs = {}, nil&lt;br /&gt;
	if #years &amp;gt; 1 then&lt;br /&gt;
		local yearToggles, monthsDivs = {}, {}&lt;br /&gt;
		for i, year in ipairs(years) do&lt;br /&gt;
			yearToggles[#yearToggles+1] = p._yearToggleButton(year)&lt;br /&gt;
			monthToggles = {}&lt;br /&gt;
			months = year.months&lt;br /&gt;
			for j, month in ipairs(months) do&lt;br /&gt;
				monthToggles[#monthToggles+1] = p._monthToggleButton(year.year, month)&lt;br /&gt;
			end&lt;br /&gt;
			monthsDivs[#monthsDivs+1] =&lt;br /&gt;
				&amp;#039;&amp;lt;div class=&amp;quot;mw-collapsible&amp;#039; .. (year.l and &amp;#039;&amp;#039; or &amp;#039; mw-collapsed&amp;#039;) ..&lt;br /&gt;
				&amp;#039;&amp;quot; id=&amp;quot;mw-customcollapsible-&amp;#039; .. year.year .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. table.concat(monthToggles) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		divs = &amp;#039;&amp;lt;div&amp;gt;&amp;#039; .. table.concat(yearToggles) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; .. table.concat(monthsDivs)&lt;br /&gt;
	else&lt;br /&gt;
		for i, month in ipairs(months) do&lt;br /&gt;
			monthToggles[#monthToggles+1] = p._monthToggleButton(nil, month)&lt;br /&gt;
		end&lt;br /&gt;
		divs = &amp;#039;&amp;lt;div&amp;gt;&amp;#039; .. table.concat(monthToggles) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	divs = divs .. &amp;#039;&amp;lt;div&amp;gt;&amp;#039; .. p._lastXToggleButton(years, duration, combinationsL) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	return &amp;#039;&amp;lt;div class=&amp;quot;nomobile&amp;quot; style=&amp;quot;text-align:center&amp;quot;&amp;gt;&amp;#039; .. divs .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p._barColors = {&lt;br /&gt;
	&amp;#039;#A50026&amp;#039;,  --deaths&lt;br /&gt;
	&amp;#039;SkyBlue&amp;#039;,  --recoveries&lt;br /&gt;
	&amp;#039;Tomato&amp;#039;,   --cases or altlbl1&lt;br /&gt;
	&amp;#039;Gold&amp;#039;,     --altlbl2&lt;br /&gt;
	&amp;#039;OrangeRed&amp;#039; --altlbl3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p._customBarStacked(args)&lt;br /&gt;
	local barargs = {}&lt;br /&gt;
&lt;br /&gt;
	barargs[1] = args[1]&lt;br /&gt;
&lt;br /&gt;
	local function _numwidth(i)&lt;br /&gt;
		local nw = args.numwidth:sub(i, i)&lt;br /&gt;
		if nw == &amp;#039;n&amp;#039; then&lt;br /&gt;
			return 0&lt;br /&gt;
		elseif nw == &amp;#039;t&amp;#039; then&lt;br /&gt;
			return 2.45&lt;br /&gt;
		elseif nw == &amp;#039;m&amp;#039; or nw == &amp;#039;d&amp;#039; then&lt;br /&gt;
			return 3.5&lt;br /&gt;
		elseif nw == &amp;#039;w&amp;#039; then&lt;br /&gt;
			return 4.55&lt;br /&gt;
		elseif nw == &amp;#039;x&amp;#039; then&lt;br /&gt;
			return 5.6&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	barargs[2] =&lt;br /&gt;
		&amp;#039;&amp;lt;span class=&amp;quot;cbs-ibr&amp;quot; style=&amp;quot;padding:0 0.3em 0 0; width:&amp;#039; .. _numwidth(1) .. &amp;#039;em&amp;quot;&amp;gt;&amp;#039; .. (args[7] or &amp;#039;&amp;#039;) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; ..&lt;br /&gt;
		&amp;#039;&amp;lt;span class=&amp;quot;cbs-ibl&amp;quot; style=&amp;quot;width:&amp;#039; .. _numwidth(2) .. &amp;#039;em&amp;quot;&amp;gt;&amp;#039; .. (args[8] or &amp;#039;&amp;#039;) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	if #args.numwidth == 4 then&lt;br /&gt;
		local pad = args.numwidth:sub(3, 3) == &amp;#039;n&amp;#039; and &amp;#039;0&amp;#039; or &amp;#039;0.3em&amp;#039;&lt;br /&gt;
		barargs.note2 =&lt;br /&gt;
			&amp;#039;&amp;lt;span class=&amp;quot;cbs-ibr&amp;quot; style=&amp;quot;padding:0 &amp;#039; .. pad .. &amp;#039; 0 0; width:&amp;#039; .. _numwidth(3) .. &amp;#039;em&amp;quot;&amp;gt;&amp;#039; .. (args[9] or &amp;#039;&amp;#039;) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; ..&lt;br /&gt;
			&amp;#039;&amp;lt;span class=&amp;quot;cbs-ibl&amp;quot; style=&amp;quot;width:&amp;#039; .. _numwidth(4) .. &amp;#039;em&amp;quot;&amp;gt;&amp;#039; .. (args[10] or &amp;#039;&amp;#039;) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i = 1, 5 do&lt;br /&gt;
		barargs[2*i + 1] = p._barColors[i]&lt;br /&gt;
		barargs[2*i + 2] = args[i+1] / args.divisor&lt;br /&gt;
		barargs[&amp;#039;title&amp;#039; .. i] = args[i+1]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	barargs.align = &amp;#039;cdcc&amp;#039;&lt;br /&gt;
	barargs.collapsed = args.collapsed&lt;br /&gt;
	barargs.id = args.id&lt;br /&gt;
	barargs.rowstyle = args.rowheight and &amp;#039;line-height:&amp;#039;.. args.rowheight ..&amp;#039;;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	return barBox._stacked(barargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._row(args)&lt;br /&gt;
	local barargs = {}&lt;br /&gt;
&lt;br /&gt;
	barargs[1] = (args[1] or &amp;#039;⋮&amp;#039;) .. (args.note0 or &amp;#039;&amp;#039;)&lt;br /&gt;
	barargs[2] = args[2] or 0&lt;br /&gt;
	barargs[3] = args[3] or 0&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;#039;alttot1&amp;#039;] then&lt;br /&gt;
		barargs[4] = args[&amp;#039;alttot1&amp;#039;]&lt;br /&gt;
	elseif args[4] then&lt;br /&gt;
		barargs[4] = (args[4] or 0) - (barargs[2] or 0) - (barargs[3] or 0)&lt;br /&gt;
	else&lt;br /&gt;
		barargs[4] = 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	barargs[5] = args[5] or 0&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;#039;alttot2&amp;#039;] then&lt;br /&gt;
		barargs[6] = args[&amp;#039;alttot2&amp;#039;]&lt;br /&gt;
	elseif args[6] then&lt;br /&gt;
		barargs[6] = (args[6] or 0) - (barargs[2] or 0) - (barargs[3] or 0)&lt;br /&gt;
	else&lt;br /&gt;
		barargs[6] = 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	barargs[7] = args[7]&lt;br /&gt;
&lt;br /&gt;
	local function changeArg(firstright, valuecol, changecol)&lt;br /&gt;
		local change = &amp;#039;&amp;#039;&lt;br /&gt;
		if args[&amp;#039;firstright&amp;#039; .. firstright] then&lt;br /&gt;
			change = &amp;#039;(&amp;#039; .. i18n.na .. &amp;#039;)&amp;#039;&lt;br /&gt;
		elseif not args[1] and args[valuecol] then&lt;br /&gt;
			change = &amp;#039;(=)&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			change = args[changecol] and &amp;#039;(&amp;#039; .. args[changecol] .. &amp;#039;)&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		change = change .. (args[&amp;#039;note&amp;#039; .. firstright] or &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		return change&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	barargs[8] = changeArg(1, 7, 8)&lt;br /&gt;
	barargs[9] = args[9]&lt;br /&gt;
	barargs[10] = changeArg(2, 9, 10)&lt;br /&gt;
&lt;br /&gt;
	barargs.divisor = args.divisor&lt;br /&gt;
	barargs.numwidth = args.numwidth&lt;br /&gt;
	barargs.rowheight = args.rowheight&lt;br /&gt;
&lt;br /&gt;
	local dates&lt;br /&gt;
	if args.collapsible then&lt;br /&gt;
		local duration = args.duration&lt;br /&gt;
		if args.daysToEnd &amp;gt;= duration then&lt;br /&gt;
			barargs.collapsed = &amp;#039;y&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			barargs.collapsed = &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if args.nooverlap and args.daysToEnd &amp;lt; duration then&lt;br /&gt;
			barargs.id = &amp;#039;l&amp;#039; .. duration&lt;br /&gt;
		elseif args.nDate then&lt;br /&gt;
			dates = {year=tonumber(os.date(&amp;#039;%Y&amp;#039;, args.nDate)), mon=lang:formatDate(&amp;#039;M&amp;#039;, os.date(&amp;#039;%Y-%m&amp;#039;, args.nDate)),&lt;br /&gt;
				l=args.daysToEnd &amp;lt; duration and &amp;#039;-l&amp;#039; .. duration, nDate=args.nDate}&lt;br /&gt;
			barargs.id = (args.multiyear and dates.year or &amp;#039;&amp;#039;) .. lang:lc(dates.mon) .. (dates.l or &amp;#039;&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			local id, y, m, ey, em = {},&lt;br /&gt;
				tonumber(os.date(&amp;#039;%Y&amp;#039;, args.nStartDate or args.nAltStartDate)),&lt;br /&gt;
				tonumber(os.date(&amp;#039;%m&amp;#039;, args.nStartDate or args.nAltStartDate)),&lt;br /&gt;
				tonumber(os.date(&amp;#039;%Y&amp;#039;, args.nEndDate   or args.nAltEndDate  )),&lt;br /&gt;
				tonumber(os.date(&amp;#039;%m&amp;#039;, args.nEndDate   or args.nAltEndDate  ))&lt;br /&gt;
			dates = {nStartDate=args.nStartDate, nAltStartDate=args.nAltStartDate, nEndDate=args.nEndDate, nAltEndDate=args.nAltEndDate}&lt;br /&gt;
&lt;br /&gt;
			repeat&lt;br /&gt;
				id[#id+1] = (args.multiyear and y or &amp;#039;&amp;#039;) .. lang:lc(monthAbbrs[m])&lt;br /&gt;
				dates[#dates+1] = {year=y, mon=monthAbbrs[m]}&lt;br /&gt;
				y = y + math.floor(m / 12)&lt;br /&gt;
				m = m % 12 + 1&lt;br /&gt;
			until y == ey and m &amp;gt; em or y &amp;gt; ey&lt;br /&gt;
&lt;br /&gt;
			dates.l = args.daysToEnd &amp;lt; duration and &amp;#039;-l&amp;#039; .. duration&lt;br /&gt;
			id = table.concat(id, &amp;#039;-&amp;#039;) .. (dates.l or &amp;#039;&amp;#039;)&lt;br /&gt;
			barargs.id = id&lt;br /&gt;
			dates.id = id&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		barargs.collapsed = &amp;#039;&amp;#039;&lt;br /&gt;
		barargs.id = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p._customBarStacked(barargs), dates&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._buildBars(args)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local updatePeriod = 86400 -- temporary implementation only supports daily updates&lt;br /&gt;
&lt;br /&gt;
	local function getUnix(timestamp)&lt;br /&gt;
		return lang:formatDate(&amp;#039;U&amp;#039;, timestamp)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rows, prevRow = {}, {}&lt;br /&gt;
	for line in mw.text.gsplit(args.data, &amp;#039;\n&amp;#039;) do&lt;br /&gt;
		local i, barargs = 1, {}&lt;br /&gt;
		-- parameter parsing, basic type/missing value handling&lt;br /&gt;
		for parameter in mw.text.gsplit(line, &amp;#039;;&amp;#039;) do&lt;br /&gt;
			if parameter:find(&amp;#039;^%s*%a&amp;#039;) then&lt;br /&gt;
				parameter = mw.text.split(parameter, &amp;#039;=&amp;#039;)&lt;br /&gt;
				parameter[1] = mw.text.trim(parameter[1])&lt;br /&gt;
				if parameter[1]:find(&amp;#039;^alttot&amp;#039;) then&lt;br /&gt;
					parameter[2] = tonumber(frame:callParserFunction(&amp;#039;#expr&amp;#039;, parameter[2]))&lt;br /&gt;
				else&lt;br /&gt;
					parameter[2] = mw.text.trim(parameter[2])&lt;br /&gt;
					if parameter[1]:find(&amp;#039;^firstright&amp;#039;) then&lt;br /&gt;
						parameter[2] = yesno(parameter[2])&lt;br /&gt;
					elseif parameter[2] == &amp;#039;&amp;#039; then&lt;br /&gt;
						parameter[2] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				barargs[parameter[1]] = parameter[2]&lt;br /&gt;
			else&lt;br /&gt;
				parameter = mw.text.trim(parameter)&lt;br /&gt;
				if parameter ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					if i &amp;gt;= 2 and i &amp;lt;= 6 then&lt;br /&gt;
						parameter = tonumber(frame:callParserFunction(&amp;#039;#expr&amp;#039;, parameter))&lt;br /&gt;
						assert(parameter, &amp;#039;data parameters 2 to 6 must not be formatted&amp;#039;)&lt;br /&gt;
					end&lt;br /&gt;
					barargs[i] = parameter&lt;br /&gt;
				end&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local bValid, nDateDiff&lt;br /&gt;
		-- get relevant date info based on previous row&lt;br /&gt;
		if barargs[1] then&lt;br /&gt;
			bValid, barargs.nDate = pcall(getUnix, barargs[1])&lt;br /&gt;
			assert(bValid, &amp;#039;invalid date &amp;quot;&amp;#039; .. barargs[1] .. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
			if prevRow.nDate or prevRow.nEndDate then&lt;br /&gt;
				nDateDiff = barargs.nDate - (prevRow.nDate or prevRow.nEndDate)&lt;br /&gt;
				if nDateDiff &amp;gt; updatePeriod then&lt;br /&gt;
					if nDateDiff == 2 * updatePeriod then&lt;br /&gt;
						prevRow = {nDate=barargs.nDate-updatePeriod}&lt;br /&gt;
						prevRow[1] = os.date(&amp;#039;%Y-%m-%d&amp;#039;, prevRow.nDate)&lt;br /&gt;
					else&lt;br /&gt;
						prevRow = {nStartDate=(prevRow.nDate or prevRow.nEndDate)+updatePeriod, nEndDate=barargs.nDate-updatePeriod}&lt;br /&gt;
					end&lt;br /&gt;
					rows[#rows+1] = prevRow&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				prevRow.nEndDate = barargs.nDate - updatePeriod&lt;br /&gt;
				if prevRow.nStartDate == prevRow.nEndDate then&lt;br /&gt;
					prevRow.nDate = prevRow.nEndDate&lt;br /&gt;
					prevRow[1] = os.date(&amp;#039;%Y-%m-%d&amp;#039;, prevRow.nDate)&lt;br /&gt;
				-- as nAltStartDate assumes a minimal multiday interval, it&amp;#039;s possible for it to be greater if a true previous span is 1 day&lt;br /&gt;
				elseif prevRow.nAltStartDate and prevRow.nAltStartDate &amp;gt;= prevRow.nEndDate then&lt;br /&gt;
					error(&amp;#039;a row in a consecutive intervals group is 1 day long and misses the date parameter&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if barargs.enddate then&lt;br /&gt;
				bValid, barargs.nEndDate = pcall(getUnix, barargs.enddate)&lt;br /&gt;
				assert(bValid, &amp;#039;invalid enddate &amp;quot;&amp;#039; .. barargs.enddate .. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			if prevRow.nDate or prevRow.nEndDate then&lt;br /&gt;
				barargs.nStartDate = (prevRow.nDate or prevRow.nEndDate) + updatePeriod&lt;br /&gt;
				if barargs.nStartDate == barargs.nEndDate then&lt;br /&gt;
					barargs.nDate = barargs.nEndDate&lt;br /&gt;
					barargs[1] = os.date(&amp;#039;%Y-%m-%d&amp;#039;, barargs.nDate)&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				prevRow.nAltEndDate = (prevRow.nStartDate or prevRow.nAltStartDate) + updatePeriod&lt;br /&gt;
				barargs.nAltStartDate = prevRow.nAltEndDate + updatePeriod&lt;br /&gt;
				if barargs.nEndDate and barargs.nAltStartDate &amp;gt;= barargs.nEndDate then&lt;br /&gt;
					error(&amp;#039;a row in a consecutive intervals group is 1 day long and misses the date parameter&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local function fillCols(col, change)&lt;br /&gt;
			local data = args[&amp;#039;right&amp;#039; .. col .. &amp;#039;data&amp;#039;]&lt;br /&gt;
			local changetype = args[&amp;#039;changetype&amp;#039; .. col]&lt;br /&gt;
			local value, num, prevnum&lt;br /&gt;
&lt;br /&gt;
			if data == &amp;#039;alttot1&amp;#039; then&lt;br /&gt;
				num = barargs.alttot1 or barargs[4]&lt;br /&gt;
				prevnum = prevRow.alttot1 or prevRow[4]&lt;br /&gt;
			elseif data == &amp;#039;alttot2&amp;#039; then&lt;br /&gt;
				num = barargs.alttot2 or barargs[6]&lt;br /&gt;
				prevnum = prevRow.alttot2 or prevRow[6]&lt;br /&gt;
			elseif data then&lt;br /&gt;
				num = barargs[data+1]&lt;br /&gt;
				prevnum = prevRow[data+1]&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if data and num then -- nothing in column, source found, and data exists&lt;br /&gt;
				value = changetype == &amp;#039;o&amp;#039; and &amp;#039;&amp;#039; or lang:formatNum(num) -- set value to num if changetype isn&amp;#039;t &amp;#039;o&amp;#039;&lt;br /&gt;
&lt;br /&gt;
				if not change and not barargs[&amp;#039;firstright&amp;#039; .. col] then&lt;br /&gt;
					if prevnum and prevnum ~= 0 then -- data on previous row&lt;br /&gt;
						if num - prevnum ~= 0 then --data has changed since previous row&lt;br /&gt;
							change = num-prevnum&lt;br /&gt;
							if changetype == &amp;#039;a&amp;#039; then -- change type is &amp;quot;absolute&amp;quot;&lt;br /&gt;
								if change &amp;gt; 0 then&lt;br /&gt;
									change = &amp;#039;+&amp;#039; .. lang:formatNum(change)&lt;br /&gt;
								end&lt;br /&gt;
							else -- change type is &amp;quot;percent&amp;quot;, &amp;quot;only percent&amp;quot; or undefined&lt;br /&gt;
								local percent = 100 * change / prevnum -- calculate percent&lt;br /&gt;
								local rounding = math.abs(percent) &amp;gt;= 10 and &amp;#039;%.0f&amp;#039; or math.abs(percent) &amp;gt;= 1 and &amp;#039;%.1f&amp;#039; or &amp;#039;%.2f&amp;#039;&lt;br /&gt;
								percent = tonumber(rounding:format(percent)) -- round to two sigfigs&lt;br /&gt;
&lt;br /&gt;
								if percent &amp;gt; 0 then&lt;br /&gt;
									change = &amp;#039;+&amp;#039; .. lang:formatNum(percent) .. &amp;#039;%&amp;#039;&lt;br /&gt;
								elseif percent &amp;lt; 0 then&lt;br /&gt;
									change = lang:formatNum(percent) .. &amp;#039;%&amp;#039;&lt;br /&gt;
								else&lt;br /&gt;
									change = &amp;#039;=&amp;#039;&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						else -- data has not changed since previous row&lt;br /&gt;
							change = &amp;#039;=&amp;#039;&lt;br /&gt;
						end&lt;br /&gt;
					else -- no data on previous row&lt;br /&gt;
						barargs[&amp;#039;firstright&amp;#039; .. col] = true -- set to (n.a.)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			return value, change&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if not barargs[7] then&lt;br /&gt;
			barargs[7], barargs[8] = fillCols(1, barargs[8])&lt;br /&gt;
		end&lt;br /&gt;
		if not barargs[9] then&lt;br /&gt;
			barargs[9], barargs[10] = fillCols(2, barargs[10])&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		rows[#rows+1] = barargs&lt;br /&gt;
		prevRow = barargs&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- calculate and pass repetitive (except daysToEnd) parameters to each row&lt;br /&gt;
	local lastRow = rows[#rows]&lt;br /&gt;
	local total = {lastRow[2] or 0, lastRow[3] or 0, [4]=lastRow[5] or 0}&lt;br /&gt;
	total[3] = lastRow.alttot1 or lastRow[4] and lastRow[4] - total[1] - total[2] or 0&lt;br /&gt;
	total[5] = lastRow.alttot2 or lastRow[6] and lastRow[6] - total[1] - total[2] or 0&lt;br /&gt;
	local divisor = (total[1] + total[2] + total[3] + total[4] + total[5]) / (0.95 * args.barwidth)&lt;br /&gt;
	local firstDate, lastDate = rows[1].nDate, lastRow.nDate or lastRow.nEndDate&lt;br /&gt;
	local multiyear = os.date(&amp;#039;%Y&amp;#039;, firstDate) ~= os.date(&amp;#039;%Y&amp;#039;, lastDate - (args.nooverlap and args.duration * 86400 or 0))&lt;br /&gt;
	if args.collapsible ~= false then&lt;br /&gt;
		args.collapsible = (lastDate - firstDate) / 86400 &amp;gt;= args.duration&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local bars, dateList = {}, {}&lt;br /&gt;
	for i, row in ipairs(rows) do -- build rows&lt;br /&gt;
		row.divisor = divisor&lt;br /&gt;
		row.numwidth = args.numwidth&lt;br /&gt;
		row.rowheight = args.rowheight&lt;br /&gt;
		row.collapsible = args.collapsible&lt;br /&gt;
		row.duration = args.duration&lt;br /&gt;
		row.nooverlap = args.nooverlap&lt;br /&gt;
		row.daysToEnd = (lastDate - (row.nDate or row.nEndDate or row.nAltEndDate)) / 86400&lt;br /&gt;
		row.multiyear = multiyear&lt;br /&gt;
&lt;br /&gt;
		bars[#bars+1], dateList[#dateList+1] = p._row(row)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(bars), dateList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._legend0(args)&lt;br /&gt;
	return&lt;br /&gt;
		&amp;#039;&amp;lt;span style=&amp;quot;font-size:90%; margin:0px&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
			&amp;#039;&amp;lt;span style=&amp;quot;background-color:&amp;#039; .. (args[1] or &amp;#039;none&amp;#039;) ..&lt;br /&gt;
			&amp;#039;; border:&amp;#039; .. (args.border or &amp;#039;none&amp;#039;) ..&lt;br /&gt;
			&amp;#039;; color:&amp;#039; .. (args[1] or &amp;#039;none&amp;#039;) .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
				&amp;#039;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;#039; .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; ..&lt;br /&gt;
			&amp;#039;&amp;amp;nbsp;&amp;#039; .. (args[2] or &amp;#039;&amp;#039;) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._chart(args)&lt;br /&gt;
	for key, value in pairs(args) do&lt;br /&gt;
		if ({float=1, barwidth=1, numwidth=1, changetype=1})[key:gsub(&amp;#039;%d&amp;#039;, &amp;#039;&amp;#039;)] then&lt;br /&gt;
			args[key] = value:lower()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local barargs = {}&lt;br /&gt;
&lt;br /&gt;
	barargs.css = &amp;#039;Module:Medical cases chart/styles.css&amp;#039;&lt;br /&gt;
	barargs.float = args.float or &amp;#039;right&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	args.barwidth = args.barwidth or &amp;#039;medium&amp;#039;&lt;br /&gt;
	local barwidth&lt;br /&gt;
	if args.barwidth == &amp;#039;thin&amp;#039; then&lt;br /&gt;
		barwidth = 120&lt;br /&gt;
	elseif args.barwidth == &amp;#039;medium&amp;#039; then&lt;br /&gt;
		barwidth = 280&lt;br /&gt;
	elseif args.barwidth == &amp;#039;wide&amp;#039; then&lt;br /&gt;
		barwidth = 400&lt;br /&gt;
	elseif args.barwidth == &amp;#039;auto&amp;#039; then&lt;br /&gt;
		barwidth = &amp;#039;auto&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;#039;unrecognized barwidth&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function _numwidth(i)&lt;br /&gt;
		local nw = args.numwidth:sub(i, i)&lt;br /&gt;
		if nw == &amp;#039;n&amp;#039; then&lt;br /&gt;
			return 0&lt;br /&gt;
		elseif nw == &amp;#039;t&amp;#039; then&lt;br /&gt;
			return 40&lt;br /&gt;
		elseif nw == &amp;#039;m&amp;#039; or nw == &amp;#039;d&amp;#039; then&lt;br /&gt;
			return 55&lt;br /&gt;
		elseif nw == &amp;#039;w&amp;#039; then&lt;br /&gt;
			return 70&lt;br /&gt;
		elseif nw == &amp;#039;x&amp;#039; then&lt;br /&gt;
			return 85&lt;br /&gt;
		else&lt;br /&gt;
			error(&amp;#039;unrecognized numwidth[&amp;#039; .. i .. &amp;#039;]&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	args.numwidth = args.numwidth or &amp;#039;mm&amp;#039;&lt;br /&gt;
	local numwidth = _numwidth(1) + 10 + _numwidth(2)&lt;br /&gt;
	local right1width = numwidth&lt;br /&gt;
	if #args.numwidth == 4 then&lt;br /&gt;
		numwidth = numwidth + _numwidth(3) + _numwidth(4)&lt;br /&gt;
		if args.numwidth:sub(3, 3) == &amp;#039;n&amp;#039; then&lt;br /&gt;
			numwidth = numwidth + 6&lt;br /&gt;
		else&lt;br /&gt;
			numwidth = numwidth + 10&lt;br /&gt;
		end&lt;br /&gt;
		if not args.right2 then&lt;br /&gt;
			right1width = numwidth&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	right1width = right1width - 8 -- -8 because of padding&lt;br /&gt;
&lt;br /&gt;
	if tonumber(barwidth) then&lt;br /&gt;
		barargs.width = 85 + barwidth + numwidth .. &amp;#039;px&amp;#039;&lt;br /&gt;
		barargs.barwidth = barwidth .. &amp;#039;px&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		barargs.width = &amp;#039;auto&amp;#039;&lt;br /&gt;
		barargs.barwidth = &amp;#039;auto&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local title = {}&lt;br /&gt;
&lt;br /&gt;
	local function spaces(n)&lt;br /&gt;
		local nbsp = &amp;#039;&amp;amp;nbsp;&amp;#039;&lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&amp;#039; .. nbsp:rep(n) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local location = lang:ucfirst(mw.ustring.gsub(args.location, i18n.the_, &amp;#039;&amp;#039;))&lt;br /&gt;
	local navbartitle = args.outbreak .. i18n._data .. &amp;#039;/&amp;#039; ..&lt;br /&gt;
		(args.location3 and args.location3 .. &amp;#039;/&amp;#039; or &amp;#039;&amp;#039;) ..&lt;br /&gt;
		(args.location2 and args.location2 .. &amp;#039;/&amp;#039; or &amp;#039;&amp;#039;) ..&lt;br /&gt;
		location .. i18n._medicalCasesChart&lt;br /&gt;
&lt;br /&gt;
	local navbar = require(&amp;#039;Module:Navbar&amp;#039;)._navbar&lt;br /&gt;
	title[1] = (args.pretitle and args.pretitle .. &amp;#039; &amp;#039; or &amp;#039;&amp;#039;) ..&lt;br /&gt;
		args.disease .. &amp;#039; &amp;#039; .. i18n.casesIn .. &amp;#039; &amp;#039; .. args.location ..&lt;br /&gt;
		(args.location2 and &amp;#039;, &amp;#039; .. args.location2 or &amp;#039;&amp;#039;) ..&lt;br /&gt;
		(args.location3 and &amp;#039;, &amp;#039; .. args.location3 or &amp;#039;&amp;#039;) ..&lt;br /&gt;
		(args.posttitle and &amp;#039; &amp;#039; .. args.posttitle or &amp;#039;&amp;#039;) .. spaces(2) ..&amp;#039;(&amp;#039; ..&lt;br /&gt;
		navbar({navbartitle, titleArg=&amp;#039;:&amp;#039; .. mw.getCurrentFrame():getParent():getTitle(), mini=1, nodiv=1}) ..&lt;br /&gt;
		&amp;#039;)&amp;lt;br /&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	title[2] = p._legend0({p._barColors[1], i18n.deaths})&lt;br /&gt;
	args.recoveries = args.recoveries == nil and true or args.recoveries&lt;br /&gt;
	title[3] = args.recoveries and spaces(3) .. p._legend0({p._barColors[2], args.reclbl or i18n.recoveries}) or &amp;#039;&amp;#039;&lt;br /&gt;
	title[4] = args.altlbl1 ~= &amp;#039;hide&amp;#039; and spaces(3) .. p._legend0({p._barColors[3], args.altlbl1 or i18n.activeCases}) or &amp;#039;&amp;#039;&lt;br /&gt;
	title[5] = args.altlbl2 and spaces(3) .. p._legend0({p._barColors[4], args.altlbl2}) or &amp;#039;&amp;#039;&lt;br /&gt;
	title[6] = args.altlbl3 and spaces(3) .. p._legend0({p._barColors[5], args.altlbl3}) or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local togglesbar, buildargs = nil, {}&lt;br /&gt;
&lt;br /&gt;
	args.right1 = args.right1 or i18n.noOfCases&lt;br /&gt;
	args.duration = args.duration or 15&lt;br /&gt;
	args.nooverlap = args.nooverlap or false&lt;br /&gt;
&lt;br /&gt;
	buildargs.barwidth = tonumber(barwidth) or 280&lt;br /&gt;
	buildargs.numwidth = args.numwidth&lt;br /&gt;
	buildargs.rowheight = args.rowheight&lt;br /&gt;
	if args.datapage then&lt;br /&gt;
		local externalData = require(&amp;#039;Module:Medical cases chart/data&amp;#039;)._externalData&lt;br /&gt;
		buildargs.data = externalData(args)&lt;br /&gt;
	else&lt;br /&gt;
		buildargs.data = args.data&lt;br /&gt;
	end&lt;br /&gt;
	-- if no right1data and right1 title is cases, use 3rd classification&lt;br /&gt;
	buildargs.right1data = args.right1data or args.right1 == i18n.noOfCases and 3&lt;br /&gt;
	-- if no right2data and right2 title is deaths, use 1st classification&lt;br /&gt;
	buildargs.right2data = args.right2data or (args.right2 == i18n.noOfDeaths or args.right2 == i18n.noOfDeaths2) and 1&lt;br /&gt;
	buildargs.changetype1 = (args.changetype1 or args.changetype or &amp;#039;&amp;#039;):sub(1, 1) -- 1st letter&lt;br /&gt;
	buildargs.changetype2 = (args.changetype2 or args.changetype or &amp;#039;&amp;#039;):sub(1, 1) -- 1st letter&lt;br /&gt;
	buildargs.collapsible = args.collapsible&lt;br /&gt;
	buildargs.duration = args.duration&lt;br /&gt;
	buildargs.nooverlap = args.nooverlap&lt;br /&gt;
&lt;br /&gt;
	local dateList&lt;br /&gt;
	barargs.bars, dateList = p._buildBars(buildargs)&lt;br /&gt;
&lt;br /&gt;
	if buildargs.collapsible then&lt;br /&gt;
		togglesbar = p._buildTogglesBar(dateList, args.duration, args.nooverlap)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	title[7] = togglesbar and &amp;#039;&amp;lt;br /&amp;gt;&amp;#039; .. togglesbar or &amp;#039;&amp;#039;&lt;br /&gt;
	barargs.title = table.concat(title)&lt;br /&gt;
&lt;br /&gt;
	barargs.left1 =&lt;br /&gt;
		&amp;#039;&amp;lt;div class=&amp;quot;center&amp;quot; style=&amp;quot;width:77px&amp;quot;&amp;gt;&amp;#039; .. -- 85-8 because of padding&lt;br /&gt;
			&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. i18n.date .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	barargs.right1 =&lt;br /&gt;
		&amp;#039;&amp;lt;div class=&amp;quot;center&amp;quot; style=&amp;quot;width:&amp;#039; .. right1width .. &amp;#039;px&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
			&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. args.right1 .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	if args.right2 then&lt;br /&gt;
		local right2width = numwidth - right1width - 16 -- -8-8...&lt;br /&gt;
		barargs.right2 =&lt;br /&gt;
			&amp;#039;&amp;lt;div class=&amp;quot;center&amp;quot; style=&amp;quot;width:&amp;#039; .. right2width ..&amp;#039;px&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
				&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. args.right2 .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	barargs.caption = args.caption&lt;br /&gt;
	return barBox._box(barargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.chart(frame)&lt;br /&gt;
	local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
	local args = getArgs(frame, {&lt;br /&gt;
		valueFunc = function (key, value)&lt;br /&gt;
			if value and value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				key = key:gsub(&amp;#039;%d&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
				if ({rowheight=1, duration=1, rightdata=1})[key] then -- if key in {...}&lt;br /&gt;
					return tonumber(value) or value&lt;br /&gt;
				end&lt;br /&gt;
				if ({recoveries=1, collapsible=1, nooverlap=1})[key] then&lt;br /&gt;
					return yesno(value)&lt;br /&gt;
				end&lt;br /&gt;
				return value&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
	return p._chart(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Aswn</name></author>
	</entry>
</feed>