<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://fanverse.click/index.php?action=history&amp;feed=atom&amp;title=Module%3ARoundN</id>
	<title>Module:RoundN - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://fanverse.click/index.php?action=history&amp;feed=atom&amp;title=Module%3ARoundN"/>
	<link rel="alternate" type="text/html" href="https://fanverse.click/index.php?title=Module:RoundN&amp;action=history"/>
	<updated>2026-04-14T03:33:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://fanverse.click/index.php?title=Module:RoundN&amp;diff=4641&amp;oldid=prev</id>
		<title>Mob: Created page with &quot;local p = { 	RD = { 		&#039;Quarter-finals&#039;, 		&#039;Semi-finals&#039;, 		&#039;Final&#039;, 		&#039;Third place&#039; 	},     -- The text and background colors are paired and when you set one, you should set the other (accessibility)     textColor = {head = &#039;#202122&#039;, &#039;#202122&#039;, &#039;#202122&#039;, &#039;#202122&#039;, &#039;#202122&#039;}, 	bgColor = {head = &#039;#f2f2f2&#039;, &#039;gold&#039;, &#039;silver&#039;, &#039;#C96&#039;, &#039;#f9f9f9&#039;}, 	reuseStr = {}, 	saveStr = function(self, name, ...) 		if not self.reuseStr[name] then 			self.reuseStr[name] = table.concat{.....&quot;</title>
		<link rel="alternate" type="text/html" href="https://fanverse.click/index.php?title=Module:RoundN&amp;diff=4641&amp;oldid=prev"/>
		<updated>2024-12-30T15:35:41Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = { 	RD = { 		&amp;#039;Quarter-finals&amp;#039;, 		&amp;#039;Semi-finals&amp;#039;, 		&amp;#039;Final&amp;#039;, 		&amp;#039;Third place&amp;#039; 	},     -- The text and background colors are paired and when you set one, you should set the other (accessibility)     textColor = {head = &amp;#039;#202122&amp;#039;, &amp;#039;#202122&amp;#039;, &amp;#039;#202122&amp;#039;, &amp;#039;#202122&amp;#039;, &amp;#039;#202122&amp;#039;}, 	bgColor = {head = &amp;#039;#f2f2f2&amp;#039;, &amp;#039;gold&amp;#039;, &amp;#039;silver&amp;#039;, &amp;#039;#C96&amp;#039;, &amp;#039;#f9f9f9&amp;#039;}, 	reuseStr = {}, 	saveStr = function(self, name, ...) 		if not self.reuseStr[name] then 			self.reuseStr[name] = table.concat{.....&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {&lt;br /&gt;
	RD = {&lt;br /&gt;
		&amp;#039;Quarter-finals&amp;#039;,&lt;br /&gt;
		&amp;#039;Semi-finals&amp;#039;,&lt;br /&gt;
		&amp;#039;Final&amp;#039;,&lt;br /&gt;
		&amp;#039;Third place&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
    -- The text and background colors are paired and when you set one, you should set the other (accessibility)&lt;br /&gt;
    textColor = {head = &amp;#039;#202122&amp;#039;, &amp;#039;#202122&amp;#039;, &amp;#039;#202122&amp;#039;, &amp;#039;#202122&amp;#039;, &amp;#039;#202122&amp;#039;},&lt;br /&gt;
	bgColor = {head = &amp;#039;#f2f2f2&amp;#039;, &amp;#039;gold&amp;#039;, &amp;#039;silver&amp;#039;, &amp;#039;#C96&amp;#039;, &amp;#039;#f9f9f9&amp;#039;},&lt;br /&gt;
	reuseStr = {},&lt;br /&gt;
	saveStr = function(self, name, ...)&lt;br /&gt;
		if not self.reuseStr[name] then&lt;br /&gt;
			self.reuseStr[name] = table.concat{...}&lt;br /&gt;
		end&lt;br /&gt;
		return self.reuseStr[name]&lt;br /&gt;
	end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--Provides a convenient naming shortcut up to {{#invoke:RoundN|N512}} = {{invoke:RoundN|main|columns = 9}}&lt;br /&gt;
for columns = 1, 9 do&lt;br /&gt;
	local N = math.pow(2, columns)&lt;br /&gt;
	p[&amp;#039;N&amp;#039; .. N] = function(frame)&lt;br /&gt;
		return p.main(frame.args, columns)&lt;br /&gt;
	end&lt;br /&gt;
	p[&amp;#039;n&amp;#039; .. N] = p[&amp;#039;N&amp;#039; .. N]--to make case insensitive&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--saves memory and avoids errors when using a nil as a table by providing a temporary table; if using nil as false; use &amp;#039;table(k)&amp;#039; to look up table[k]&lt;br /&gt;
p.nilAsTab = {&lt;br /&gt;
	__index = function(t, i)&lt;br /&gt;
		return setmetatable({}, setmetatable(p.nilAsTab, {__index = {t = t, i = i}}))&lt;br /&gt;
	end,&lt;br /&gt;
	__newindex = function (pt, pi, v) --store new values in actual table rather than temporary&lt;br /&gt;
		rawset(p.nilAsTab.t, p.nilAsTab.i, {})[p.nilAsTab.i][pi] = v&lt;br /&gt;
		setmetatable(p.nilAsTab.t[p.nilAsTab.i], {__call = p.nilAsTab.__call})&lt;br /&gt;
	end,&lt;br /&gt;
	__call = function(t, i)&lt;br /&gt;
		return t and rawget(t, i)&lt;br /&gt;
	end&lt;br /&gt;
}&lt;br /&gt;
--never assign a value to these or they will stop being empty&lt;br /&gt;
local infiniteEmpty = setmetatable({}, {__index = setmetatable({}, p.nilAsTab), p.nilAsTab}) -- infiniteEmpty[1][2][3]...[infinity] = {}&lt;br /&gt;
local callableEmpty = setmetatable({}, p.nilAsTab)&lt;br /&gt;
&lt;br /&gt;
local rowNum, head, m, col, tab, esc = {}, {}, {num = 1, phase = 0, bold = infiniteEmpty}, {}, mw.html.create&amp;#039;table&amp;#039;, {&lt;br /&gt;
	bs = require&amp;#039;Module:Escape&amp;#039;,--backslash&lt;br /&gt;
	comma = {[&amp;#039;(%([^,]*),([^%)]*%))&amp;#039;] = &amp;#039;%1|@!#|%2&amp;#039;},--escape commas in ()&lt;br /&gt;
}&lt;br /&gt;
local nodeFunc = {&lt;br /&gt;
	scanPattern = function(self, args, step)&lt;br /&gt;
		self.pattern = nil&lt;br /&gt;
		if args[step] then&lt;br /&gt;
			self.pattern, self.nonFunc = string.match(esc.bs:text(args[step]), &amp;#039;^node_function{(.-)}(.*)&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if self.pattern then&lt;br /&gt;
			for k, v in pairs(esc.comma) do&lt;br /&gt;
				self.pattern = self.pattern:gsub(k, v)&lt;br /&gt;
			end&lt;br /&gt;
			self.nonFunc = self.nonFunc and esc.bs:undo(self.nonFunc)&lt;br /&gt;
			self.pattern = mw.text.split(self.pattern, &amp;#039;%s*,%s*&amp;#039;)&lt;br /&gt;
			for k, v in ipairs(self.pattern) do&lt;br /&gt;
				local func, arg = string.match(v, &amp;#039;^(%w+)%(?([^%)]*)&amp;#039;)&lt;br /&gt;
				if func and self[func] and self[func].main then&lt;br /&gt;
					self.pattern[k] = func&lt;br /&gt;
					if arg then&lt;br /&gt;
						for x, y in pairs(esc.comma) do&lt;br /&gt;
							arg = esc.bs:undo(arg):gsub(y:gsub(&amp;#039;%%%d&amp;#039;, &amp;#039;&amp;#039;), x:match(&amp;#039;%)([^%(])%(&amp;#039;) or x:gsub(&amp;#039;\\&amp;#039;, &amp;#039;&amp;#039;))&lt;br /&gt;
						end&lt;br /&gt;
						self[func].arg = self[func].arg or {}&lt;br /&gt;
						self[func].arg[m.num] = arg&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return self.pattern&lt;br /&gt;
	end,&lt;br /&gt;
	helper = {&lt;br /&gt;
		topBranch = function()--node is top of fork if top is 0&lt;br /&gt;
			return (m.num - col.top) % 2&lt;br /&gt;
		end,&lt;br /&gt;
		addText = function(text)&lt;br /&gt;
			if text and text ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				tab.r:wikitext(text)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	line = {--this node is omitted and replaced with a line&lt;br /&gt;
		main = function(x)&lt;br /&gt;
			local h = p.getNodeFunc()&lt;br /&gt;
			if m.available then&lt;br /&gt;
				local text, topId, isTop, notTop = h.line.arg[m.num] or &amp;#039;&amp;#039;, h.topBranch()&lt;br /&gt;
				isTop = topId == 0&lt;br /&gt;
				notTop = {[isTop and 1 or 0] = p.reuseStr.solid}&lt;br /&gt;
				for k = 0, 1 do&lt;br /&gt;
					tab.r = rowNum[m.r + k * 4]:tag&amp;#039;td&amp;#039;&lt;br /&gt;
						:css(notTop[k] and&lt;br /&gt;
							{[isTop and &amp;#039;border-top&amp;#039; or &amp;#039;border-bottom&amp;#039;] = notTop[k]}&lt;br /&gt;
							or {}&lt;br /&gt;
						)&lt;br /&gt;
						:attr{&lt;br /&gt;
							rowspan = ({[0] = 4, 2})[k],&lt;br /&gt;
							colspan = p.colspan&lt;br /&gt;
						}&lt;br /&gt;
					h.addText(text or h.nonFunc)&lt;br /&gt;
					text = nil&lt;br /&gt;
				end&lt;br /&gt;
				m.available = false&lt;br /&gt;
			else&lt;br /&gt;
				return nil&lt;br /&gt;
			end&lt;br /&gt;
			return x&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	bridge = {--Draw a line to the neighboring node in the same column that is not connected to the current node&lt;br /&gt;
		main = function(x)&lt;br /&gt;
			local h = p.getNodeFunc()&lt;br /&gt;
			h.bridge.lay[col.c][m.num - col.top + 1 + (h.topBranch() == 1 and 1 or -1)] = true&lt;br /&gt;
			h.addText(nonFunc)&lt;br /&gt;
			return x&lt;br /&gt;
		end,&lt;br /&gt;
		lay = setmetatable({}, p.nilAsTab)&lt;br /&gt;
	},&lt;br /&gt;
	canvas = {--Merges all cells in node. Content will be the next parameter.&lt;br /&gt;
		main = function(x)&lt;br /&gt;
			local h = p.getNodeFunc()&lt;br /&gt;
			if m.available then&lt;br /&gt;
				tab.r = rowNum[m.r]:tag&amp;#039;td&amp;#039;&lt;br /&gt;
					:attr{&lt;br /&gt;
						rowspan = 6,&lt;br /&gt;
						colspan = p.colspan&lt;br /&gt;
					}&lt;br /&gt;
				h.addText(h.nonFunc)&lt;br /&gt;
				m.available = false&lt;br /&gt;
				return x&lt;br /&gt;
			else&lt;br /&gt;
				return nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	orphan = {--sets a flag for skipMatch to be set by p._main&lt;br /&gt;
		main = function(x)&lt;br /&gt;
			p.getNodeFunc().orphan.num = m.num&lt;br /&gt;
			return x&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	skipAllowed = {--table of supported node functions when node is skipped (i.e. by skipmatch)&lt;br /&gt;
		bridge = true,&lt;br /&gt;
		canvas = true&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
setmetatable(nodeFunc.helper, {__index = nodeFunc})&lt;br /&gt;
function p.getNodeFunc()&lt;br /&gt;
	return nodeFunc.helper&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function newRow(bodyRow)&lt;br /&gt;
	local first = p.flex_tree.merge and mw.clone(p.flex_tree.cell) or p.flex_tree.cell&lt;br /&gt;
	tab.r = tab:tag&amp;#039;tr&amp;#039;&lt;br /&gt;
		:node(first)&lt;br /&gt;
	if bodyRow then&lt;br /&gt;
		table.insert(rowNum, bodyRow, tab.r)&lt;br /&gt;
		if p.flex_tree.merge then&lt;br /&gt;
			rowNum[bodyRow].first = first&lt;br /&gt;
			rowNum[bodyRow].first.unchanged = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function drawHead(text, row3rd)&lt;br /&gt;
	local td = (row3rd and rowNum[row3rd]:tag&amp;#039;td&amp;#039;:attr{rowspan = 2}&lt;br /&gt;
		or head.row:tag&amp;#039;td&amp;#039;)&lt;br /&gt;
		:attr{colspan = p.colspan}&lt;br /&gt;
	if text ~= &amp;#039;omit_label&amp;#039; then&lt;br /&gt;
		td:wikitext(text):css{&lt;br /&gt;
			[&amp;#039;text-align&amp;#039;] = &amp;#039;center&amp;#039;,&lt;br /&gt;
			border = &amp;#039;1px solid #aaa&amp;#039;,&lt;br /&gt;
			[&amp;#039;background-color&amp;#039;] = p.bgColor.head,&lt;br /&gt;
			color = p.textColor.head&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function spacer(width)&lt;br /&gt;
	tab.r:tag&amp;#039;td&amp;#039;&lt;br /&gt;
		:attr{width = width}&lt;br /&gt;
		:wikitext(p.no_column_head and &amp;#039;&amp;#039; or &amp;#039;&amp;amp;nbsp;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function dpBox(v, r)&lt;br /&gt;
	p.dpBoxBase = p.dpBoxBase or mw.html.create&amp;#039;td&amp;#039;:attr{rowspan = 2, colspan = p.colspan}&lt;br /&gt;
	if not v then&lt;br /&gt;
		p.dpBoxEmpty = p.previewnumbers and mw.clone(p.dpBoxBase) or p.dpBoxEmpty or mw.clone(p.dpBoxBase):wikitext(p.flex_tree.wt)&lt;br /&gt;
		rowNum[r]:node(p.dpBoxEmpty)&lt;br /&gt;
	else&lt;br /&gt;
		rowNum[r]:node(mw.clone(p.dpBoxBase):wikitext(v))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.scoreWasher = {&lt;br /&gt;
	numberFormat = &amp;#039;%-?%d+%.?%d*&amp;#039;,&lt;br /&gt;
	main = function (self, s)&lt;br /&gt;
		if s then&lt;br /&gt;
			for _, cycle in ipairs(self.cycles) do&lt;br /&gt;
				s = s:gsub(unpack(cycle))&lt;br /&gt;
			end&lt;br /&gt;
			if p.scoreSumBox and self.plus then&lt;br /&gt;
				local t = 0&lt;br /&gt;
				for _, part in ipairs(mw.text.split(s, self.plus)) do&lt;br /&gt;
					t = t + (tonumber(part:match(&amp;#039;%-?%d+%.?%d*&amp;#039;)) or 0)&lt;br /&gt;
				end&lt;br /&gt;
				return t&lt;br /&gt;
			end&lt;br /&gt;
			return tonumber(s:match(self.numberFormat)) or math.huge&lt;br /&gt;
		end&lt;br /&gt;
		return 0&lt;br /&gt;
	end,&lt;br /&gt;
	spin = function(self, v)&lt;br /&gt;
		table.insert(self, v)&lt;br /&gt;
		return self&lt;br /&gt;
	end,&lt;br /&gt;
	load = function (self, cycle)&lt;br /&gt;
		local wash, rinse = 0, {spin = self.spin}&lt;br /&gt;
		for v in cycle:gfind(&amp;#039;%(([^%(%)]-)%)&amp;#039;) do&lt;br /&gt;
			if v == &amp;#039;_plus_&amp;#039; then&lt;br /&gt;
				self.plus = v&lt;br /&gt;
				rinse:spin(v)&lt;br /&gt;
				cycle = cycle:gsub(&amp;#039;%(_plus_%)&amp;#039;, &amp;#039;&amp;#039;, 1)&lt;br /&gt;
			else&lt;br /&gt;
				wash = wash + 1&lt;br /&gt;
				rinse:spin(&amp;#039;%&amp;#039;):spin(wash)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(self.cycles, {esc.bs:undo(cycle, &amp;#039;%%&amp;#039;), table.concat(rinse)})&lt;br /&gt;
	end,&lt;br /&gt;
	init = function(self, setting)&lt;br /&gt;
		self.cycles = {original = setting}&lt;br /&gt;
		for cycle in (setting and esc.bs:text(setting) or &amp;#039;{&amp;lt;.-&amp;gt;} {[^%d]*}&amp;#039;):gfind(&amp;#039;{(.-)}&amp;#039;) do&lt;br /&gt;
			self:load(cycle)&lt;br /&gt;
		end&lt;br /&gt;
	end,&lt;br /&gt;
		sum = function (clean)&lt;br /&gt;
		local sum = {0, 0}&lt;br /&gt;
		for _, box in ipairs(clean) do&lt;br /&gt;
			for team, score in ipairs(box) do&lt;br /&gt;
				sum[team] = sum[team] + score&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return unpack(math.max(unpack(sum)) == math.huge and {&amp;#039;&amp;amp;mdash;&amp;#039;, &amp;#039;&amp;amp;mdash;&amp;#039;} or sum)&lt;br /&gt;
	end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function boldWin(s1, s2)&lt;br /&gt;
	return setmetatable(&lt;br /&gt;
		p.bold and s1 ~= s2 and (math[({&amp;#039;min&amp;#039;, &amp;#039;max&amp;#039;})[p.bold]](s1, s2) == s1 and {true} or {[2] = true}) or callableEmpty,&lt;br /&gt;
		p.nilAsTab&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function maxSpan(span, start, rows)&lt;br /&gt;
	return math.min(span, math.max(0, rows - start + 1))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--in case of templates like RDseed need padding value&lt;br /&gt;
p.teamBoxPadding = function()&lt;br /&gt;
	return &amp;#039;.6ex&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
p.teamBoxPadTab = {padding = &amp;#039;0 &amp;#039; .. p.teamBoxPadding()}&lt;br /&gt;
p.teamBoxNormal = {border = &amp;#039;1px solid #aaa&amp;#039;, [&amp;#039;background-color&amp;#039;] = p.bgColor[4], color = p.textColor[4]}&lt;br /&gt;
local function teamBox(v, r, f)&lt;br /&gt;
	if p.flex_tree.merge and not v and f.phase == 2 then&lt;br /&gt;
		for i = -2, 0 do&lt;br /&gt;
			if rowNum[r + i].first.unchanged then&lt;br /&gt;
				rowNum[r + i].first.unchanged = nil&lt;br /&gt;
				rowNum[r + i].first:node(p.unflex_div)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		tab.r:attr{rowspan = 4}:css{[&amp;#039;vertical-align&amp;#039;] = &amp;#039;center&amp;#039;}&lt;br /&gt;
	else&lt;br /&gt;
		if not p.bold then&lt;br /&gt;
		--backwards compatability (wikitemplates bold each arg individually)&lt;br /&gt;
			local hasBold, b = tostring(v):gsub(&amp;quot;([^&amp;#039;]*)&amp;#039;&amp;#039;&amp;#039;([^&amp;#039;]*)&amp;quot;, &amp;#039;%1&amp;lt;b&amp;gt;%2&amp;lt;/b&amp;gt;&amp;#039;)&lt;br /&gt;
			if b == 1 then&lt;br /&gt;
				v = hasBold&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local cell&lt;br /&gt;
		if f[1] then&lt;br /&gt;
			cell = f.sumBox and f.sumBox[1] and&lt;br /&gt;
				{padding = f.sumBox[1]}&lt;br /&gt;
				or {[&amp;#039;border-left&amp;#039;] = f.borderLeft}&lt;br /&gt;
			cell[&amp;#039;text-align&amp;#039;] = v and f[1]&lt;br /&gt;
		else&lt;br /&gt;
			cell = p.teamBoxPadTab&lt;br /&gt;
		end&lt;br /&gt;
		local text = v or f[1] and &amp;#039;&amp;#039; or &amp;#039;&amp;amp;nbsp;&amp;#039;&lt;br /&gt;
		if f.bold then&lt;br /&gt;
			text = mw.ustring.gsub(text, &amp;#039;(%(%[%[[^%[%]]*%]%]%))&amp;#039;, &amp;#039;&amp;lt;span style=&amp;quot;font-weight:normal&amp;quot;&amp;gt;%1&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		tab.r = rowNum[r]:tag&amp;#039;td&amp;#039;&lt;br /&gt;
			:css(p.teamBoxCSS)&lt;br /&gt;
			:css(cell)&lt;br /&gt;
			:attr{rowspan = 2}&lt;br /&gt;
			:node(mw.html.create(f.bold and &amp;#039;b&amp;#039;):wikitext(text))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	function args:clean(key, params)--prevent html comments from breaking named args and reduces repeat concatenation&lt;br /&gt;
		params = params or {}&lt;br /&gt;
		local clean = args[key] or params.ifNil&lt;br /&gt;
		if clean then&lt;br /&gt;
			params.append = params.append or &amp;#039;&amp;#039;&lt;br /&gt;
			clean = mw.text.decode(clean):gsub(&amp;#039;&amp;lt;!%-.-%-&amp;gt;&amp;#039;, &amp;#039;&amp;#039;):gsub(params.pattern or &amp;#039;[^%w-;%.]&amp;#039;, &amp;#039;&amp;#039;) .. params.append&lt;br /&gt;
			clean = clean ~= params.append and clean or params.ifNil&lt;br /&gt;
		end&lt;br /&gt;
		args[key] = params.keepOld and args[key] or clean&lt;br /&gt;
		return clean&lt;br /&gt;
	end&lt;br /&gt;
	p.cols = tonumber(args:clean(&amp;#039;columns&amp;#039;, {pattern = &amp;#039;%D&amp;#039;}))&lt;br /&gt;
	p.tCols = (tonumber(args:clean(&amp;#039;final_RDs_excluded&amp;#039;, {pattern = &amp;#039;%D&amp;#039;})) or 0) + p.cols&lt;br /&gt;
	local matchPer = {&lt;br /&gt;
		pattern = &amp;#039;%d*per%d+[%-x]%d+&amp;#039;,&lt;br /&gt;
		vals = &amp;#039;(%d*)per(%d+)([%-x])(%d+)&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	local skipMatch, unBold  = {}, {}--(skip|manualbold)match# to boolean&lt;br /&gt;
	for k, _ in pairs(args) do&lt;br /&gt;
		local mType, mNum = string.match(k, &amp;#039;^(%l+)match(%d*)$&amp;#039;)&lt;br /&gt;
		mType, mNum = ({skip = skipMatch, manualbold = unBold})[mType], tonumber(mNum)&lt;br /&gt;
		if mType then&lt;br /&gt;
			if mNum then&lt;br /&gt;
				mType[mNum] = args:clean(k) == &amp;#039;yes&amp;#039; or args[k] == &amp;#039;true&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				for pattern in args:clean(k, {ifNil = &amp;#039;&amp;#039;}):gfind(matchPer.pattern) do&lt;br /&gt;
					local d1, period, op, d2 = pattern:match(matchPer.vals)&lt;br /&gt;
					d1 = tonumber(d1) or 1&lt;br /&gt;
					d2 = op == &amp;#039;-&amp;#039; and d2 or (d1 + period * (d2 - 1))&lt;br /&gt;
					for y = d1, d2, period do&lt;br /&gt;
						mType[y] = true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				for _, x in ipairs(mw.text.split(args[k]:gsub(matchPer.pattern, &amp;#039;&amp;#039;):gsub(&amp;#039;[;%-%a][;%-%a]+&amp;#039;, &amp;#039;;&amp;#039;):match(&amp;#039;^;*(.-)[;%-]*$&amp;#039;), &amp;#039;;&amp;#039;)) do&lt;br /&gt;
					x = mw.text.split(x, &amp;#039;-&amp;#039;)&lt;br /&gt;
					for y = tonumber(x[1]) or 1, tonumber(x[2] or x[1]) or 0 do&lt;br /&gt;
						mType[y] = true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, v in ipairs({--more args to boolean&lt;br /&gt;
		&amp;#039;widescore&amp;#039;,&lt;br /&gt;
		&amp;#039;color&amp;#039;,&lt;br /&gt;
		&amp;#039;color_repechage&amp;#039;,&lt;br /&gt;
		&amp;#039;3rdplace&amp;#039;,&lt;br /&gt;
		&amp;#039;omit_blanks&amp;#039;,&lt;br /&gt;
		&amp;#039;scroll_head_unlock&amp;#039;,&lt;br /&gt;
		&amp;#039;previewnumbers&amp;#039;,&lt;br /&gt;
		&amp;#039;flex_tree&amp;#039;,&lt;br /&gt;
		&amp;#039;no_column_head&amp;#039;,&lt;br /&gt;
		&amp;#039;short_brackets&amp;#039;,&lt;br /&gt;
		&amp;#039;branch_upwards&amp;#039;&lt;br /&gt;
	}) do&lt;br /&gt;
		if args[v] and (p[v] == nil or type(p[v]) == &amp;#039;boolean&amp;#039;) then&lt;br /&gt;
			p[v] = args:clean(v) == &amp;#039;yes&amp;#039; or args[v] == &amp;#039;true&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	p.namespace = mw.title.getCurrentTitle().namespace&lt;br /&gt;
	p.previewnumbers = p.namespace ~= 0 and p.previewnumbers&lt;br /&gt;
	p.scoreWasher:init(args[&amp;#039;score-clean&amp;#039;])&lt;br /&gt;
	p.scoreWasher.demo = args.demoWash and tonumber(args:clean(&amp;#039;demoWash&amp;#039;, {pattern = &amp;#039;%D&amp;#039;}), 10)&lt;br /&gt;
	p.scoreSumBox = args[&amp;#039;score-boxes&amp;#039;] and args[&amp;#039;score-boxes&amp;#039;]:match(&amp;#039;%d ?%+ ?sum&amp;#039;)&lt;br /&gt;
	p.bold = ({low = 1, high = 2})[args:clean(&amp;#039;bold_winner&amp;#039;)] or p.scoreSumBox and 2&lt;br /&gt;
	local sumBox = p.scoreSumBox and 1 or 0&lt;br /&gt;
	p.scoreBoxes = (tonumber(args:clean(&amp;#039;score-boxes&amp;#039;, {pattern = &amp;#039;%D&amp;#039;})) or 1) + sumBox&lt;br /&gt;
	p.scoreSumBox = p.scoreBoxes &amp;gt; 0 and p.scoreSumBox or nil&lt;br /&gt;
	local boxStyle = p.scoreBoxes &amp;gt; 1 and&lt;br /&gt;
		(p.scoreSumBox and&lt;br /&gt;
			setmetatable(&lt;br /&gt;
				{{}, [p.scoreBoxes] = {&amp;#039;0 1ex&amp;#039;}},&lt;br /&gt;
				{__call = function(t, i) if t[i] then return nil end return 0 end}&lt;br /&gt;
			)&lt;br /&gt;
			or setmetatable(&lt;br /&gt;
				{},&lt;br /&gt;
				{__call = function() return 0 end}&lt;br /&gt;
			)&lt;br /&gt;
		)&lt;br /&gt;
		or setmetatable({}, {__call = function() return nil end})&lt;br /&gt;
	p.colspan = p.scoreBoxes &amp;gt; 0 and (p.scoreBoxes + 1) or nil&lt;br /&gt;
	local nodeArgs = {&lt;br /&gt;
		score = p.scoreBoxes - sumBox,&lt;br /&gt;
		team = {offset = 1 + p.scoreBoxes - sumBox}&lt;br /&gt;
	}&lt;br /&gt;
	nodeArgs.all = 1 + nodeArgs.team.offset * 2&lt;br /&gt;
	nodeArgs.tableSum = {&lt;br /&gt;
		__add = function(v, t)&lt;br /&gt;
			if #t == 3 then&lt;br /&gt;
				return v + nodeArgs.all&lt;br /&gt;
			end&lt;br /&gt;
			local s = v&lt;br /&gt;
			for i, n in ipairs(t) do&lt;br /&gt;
				s = s + n&lt;br /&gt;
			end&lt;br /&gt;
			return s--[[ + (p.scoreSumBox and #t == 3 and -2 or 0) --merging disabled with score boxes, uncomment if enable]]&lt;br /&gt;
		end&lt;br /&gt;
	}&lt;br /&gt;
	nodeArgs.team[1] = 1--constant to be replaced later by new param&lt;br /&gt;
	nodeArgs.team[2] = nodeArgs.team[1] + nodeArgs.team.offset&lt;br /&gt;
	nodeArgs.blank = setmetatable({}, nodeArgs.tableSum)&lt;br /&gt;
	p.unflex_div = mw.html.create&amp;#039;div&amp;#039;&lt;br /&gt;
					:css{overflow = &amp;#039;hidden&amp;#039;, height = &amp;#039;1ex&amp;#039;}&lt;br /&gt;
					:wikitext&amp;#039;&amp;amp;nbsp;&amp;#039;&lt;br /&gt;
	p.flex_tree = setmetatable({},{__index = {&lt;br /&gt;
		merge = p.flex_tree and p.scoreBoxes == 0,&lt;br /&gt;
		wt = p.flex_tree and &amp;#039;&amp;#039; or &amp;#039;&amp;amp;nbsp;&amp;#039;,&lt;br /&gt;
		cell = mw.html.create&amp;#039;td&amp;#039;&lt;br /&gt;
			:node(not p.flex_tree and p.unflex_div or nil)&lt;br /&gt;
	}})&lt;br /&gt;
	if args:clean&amp;#039;scroll_height&amp;#039; then&lt;br /&gt;
		local fontSize, fontUnit = args.style and args.style:match(&amp;#039;font%-size *: *(%d+)([^ ]+)&amp;#039;)&lt;br /&gt;
		if fontSize then&lt;br /&gt;
			local units = {&lt;br /&gt;
				em = 1,&lt;br /&gt;
				ex = 2,&lt;br /&gt;
				[&amp;#039;%&amp;#039;] = 0.01&lt;br /&gt;
			}&lt;br /&gt;
			fontSize, fontUnit = {fontSize * fontUnit}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	tab&lt;br /&gt;
		:cssText(table.concat{args.scroll_height and &amp;#039;padding&amp;#039; or &amp;#039;margin&amp;#039;, &amp;#039;:&amp;#039;, fontSize and (math.ceil(fontSize * 10) / 10) or &amp;#039;.9&amp;#039;, &amp;#039;em 2em 1em 1em;border:0;&amp;#039;, fontSize and &amp;#039;&amp;#039; or &amp;#039;font-size:90%;border-collapse:separate;&amp;#039;, args.style})&lt;br /&gt;
		:attr{cellpadding = 0, cellspacing = 0}&lt;br /&gt;
	if not p.no_column_head then--headings row&lt;br /&gt;
		newRow()&lt;br /&gt;
		head.row = tab.r&lt;br /&gt;
			:css{[&amp;#039;white-space&amp;#039;] = args.scroll_height and &amp;#039;nowrap&amp;#039;}&lt;br /&gt;
		newRow()&lt;br /&gt;
	else&lt;br /&gt;
		tab.r = tab:tag&amp;#039;tr&amp;#039;&lt;br /&gt;
		tab.r:tag&amp;#039;td&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local sp = {--set column widths&lt;br /&gt;
		args[&amp;#039;team-width&amp;#039;] or 170,&lt;br /&gt;
		p.widescore and 40 or 30,&lt;br /&gt;
		p.short_brackets and 6 or 15,&lt;br /&gt;
		p.short_brackets and 4 or 20&lt;br /&gt;
	}&lt;br /&gt;
	local scoreWidth = args:clean(&amp;#039;score-width&amp;#039;, {pattern = &amp;#039;[^%d;]&amp;#039;}) and mw.text.split(args[&amp;#039;score-width&amp;#039;], &amp;#039;;&amp;#039;) or {}&lt;br /&gt;
	scoreWidth[1] = tonumber(scoreWidth[1], 10)&lt;br /&gt;
	if p.scoreSumBox and #scoreWidth ~= 1 then&lt;br /&gt;
		local _scoreWidth = {}&lt;br /&gt;
		for k = 1, p.scoreBoxes - 1 do&lt;br /&gt;
			_scoreWidth[k] = tonumber(scoreWidth[k], 10) or math.ceil(sp[2] * 0.75)&lt;br /&gt;
		end&lt;br /&gt;
		setmetatable(scoreWidth, _scoreWidth)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local head_br = {&lt;br /&gt;
		count = 0,&lt;br /&gt;
		compare = function (self, text)&lt;br /&gt;
			if text and args.scroll_height then&lt;br /&gt;
				local _, count = text:gsub(&amp;#039;&amp;lt;br[ &amp;gt;/]&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
				self.count = math.max(self.count, count)&lt;br /&gt;
			end&lt;br /&gt;
			return text&lt;br /&gt;
		end&lt;br /&gt;
	}&lt;br /&gt;
	p.branch_upwards = p.branch_upwards and 0&lt;br /&gt;
	for k = 1, p.cols do&lt;br /&gt;
		if k &amp;gt; 1 then&lt;br /&gt;
			spacer(sp[3])&lt;br /&gt;
			spacer(sp[4])&lt;br /&gt;
			if not p.no_column_head then&lt;br /&gt;
				head.row:tag&amp;#039;td&amp;#039;:attr{colspan = 2}&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		spacer(sp[1])&lt;br /&gt;
		for s = 1, p.scoreBoxes do&lt;br /&gt;
			spacer(#scoreWidth == 1 and scoreWidth[1] or scoreWidth[s] or sp[2])&lt;br /&gt;
		end&lt;br /&gt;
		if not p.no_column_head then&lt;br /&gt;
			head.wt = head_br:compare(args:clean(&amp;#039;RD&amp;#039; .. k, {pattern = &amp;#039;&amp;#039;}))&lt;br /&gt;
				or p.RD[#p.RD + k - p.tCols - 1]&lt;br /&gt;
				or (&amp;#039;Round of &amp;#039; .. math.pow(2, p.tCols - k + 1))&lt;br /&gt;
			drawHead(head.wt)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	sp.row = tab.r&lt;br /&gt;
	col.tot = math.pow(2, p.tCols - 1)&lt;br /&gt;
	local step, bump, bumpBase, rows = 1, 0, mw.html.create&amp;#039;td&amp;#039;:attr{colspan = p.colspan}, col.tot * 6--Begin body row output&lt;br /&gt;
	args.line_px = table.concat{args:clean(&amp;#039;line_px&amp;#039;) or 3, args.line_px ~= &amp;#039;0&amp;#039; and &amp;#039;px&amp;#039; or nil}&lt;br /&gt;
	tab.line = {--reduces concats and &amp;#039;or&amp;#039; statements&lt;br /&gt;
		{&lt;br /&gt;
			[true] = args.line_px,&lt;br /&gt;
			[false] = 0&lt;br /&gt;
		},&lt;br /&gt;
		args.line_px:rep(2):gsub(&amp;#039;(%a)(%d)&amp;#039;, &amp;#039;%1 %2&amp;#039;, 1)&lt;br /&gt;
	}&lt;br /&gt;
	p[&amp;#039;3rdplace&amp;#039;] =  p.tCols == p.cols and (p[&amp;#039;3rdplace&amp;#039;] or p.cols &amp;gt; 3 and nil == p[&amp;#039;3rdplace&amp;#039;] and not p.no_column_head)&lt;br /&gt;
	if p[&amp;#039;3rdplace&amp;#039;] then&lt;br /&gt;
		p.textThird = args.Consol or args[&amp;#039;RD&amp;#039; .. (p.cols + 1)] or p.RD[4]&lt;br /&gt;
		local no3rdText = p.no_column_head or p.textThird and p.textThird:match(&amp;#039;omit_label&amp;#039;)&lt;br /&gt;
		rowNum.third = math.max(math.pow(2, p.branch_upwards and -3 or p.cols - 2) * 9 + (no3rdText and 4 or 9), no3rdText and 12 or 17, rows)&lt;br /&gt;
	end&lt;br /&gt;
	for r = 1, rowNum.third or rows do&lt;br /&gt;
		newRow(r)&lt;br /&gt;
	end&lt;br /&gt;
	p:saveStr(&amp;#039;solid&amp;#039;, tab.line[1][true], &amp;#039; solid&amp;#039;)&lt;br /&gt;
	p.cornerDiv = mw.html.create&amp;#039;div&amp;#039;:css{height = tab.line[1][true], [&amp;#039;border-right&amp;#039;] = p.reuseStr.solid}&lt;br /&gt;
	for c = 1, p.cols do&lt;br /&gt;
		col.c = c&lt;br /&gt;
		local bumps = bump&lt;br /&gt;
		if c &amp;gt; 1 then&lt;br /&gt;
			col.tot = col.tot + math.pow(2, p.tCols - c)&lt;br /&gt;
			if p.branch_upwards then&lt;br /&gt;
				bumps = 0&lt;br /&gt;
				rowNum[1]:tag&amp;#039;td&amp;#039;:attr{rowspan = 4}&lt;br /&gt;
			else&lt;br /&gt;
			rowNum[1]:node(c &amp;lt; p.cols and&lt;br /&gt;
				mw.clone(bumpBase):attr{rowspan = bump}&lt;br /&gt;
			)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		col.top = m.num&lt;br /&gt;
		p.span = p.tCols &amp;gt; c and bump * 2 or p.branch_upwards or math.max((bump - 1) / 2, 2)&lt;br /&gt;
		col.color_repechage = p[&amp;#039;color_repechage&amp;#039;] and ((c == p.tCols) or ((c == p.tCols-1) and skipMatch[math.pow(2, p.tCols) - 1]))&lt;br /&gt;
		col.show3rd = p[&amp;#039;3rdplace&amp;#039;] and c == p.tCols and rowNum.third&lt;br /&gt;
		local colorFinal, bumpMid = p.color and c == p.tCols, p.span &amp;gt; 0 and mw.clone(bumpBase):attr{rowspan = p.span} or nil&lt;br /&gt;
		for r = 1, col.show3rd or rows, 2 do&lt;br /&gt;
			m.r = r + bumps&lt;br /&gt;
			if col.show3rd or rowNum[m.r] and m.num &amp;lt;= col.tot then&lt;br /&gt;
				if m.phase == 0 then&lt;br /&gt;
					m.showBox = setmetatable({1, nodeArgs.team.offset, nodeArgs.team.offset}, nodeArgs.tableSum)&lt;br /&gt;
					if nodeFunc:scanPattern(args, step) then&lt;br /&gt;
						nodeFunc.called = {}&lt;br /&gt;
						m.available = true&lt;br /&gt;
					else&lt;br /&gt;
						m.available = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if skipMatch[m.num] then&lt;br /&gt;
					if m.phase == 0 then&lt;br /&gt;
						if nodeFunc.pattern then&lt;br /&gt;
							for x, y in ipairs(nodeFunc.pattern) do&lt;br /&gt;
								if nodeFunc.skipAllowed[y] then&lt;br /&gt;
									nodeFunc.called[y] = nodeFunc[y].main(x)&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						local canvas = nodeFunc.pattern and nodeFunc.called.canvas and 6&lt;br /&gt;
						rowNum[m.r + (canvas or 0)]:tag&amp;#039;td&amp;#039;:attr{rowspan = maxSpan((canvas and 0 or 6) + bump * 2, m.r + (canvas or 0), rows), colspan = p.colspan}&lt;br /&gt;
					elseif m.phase == 2 then&lt;br /&gt;
						if nodeFunc.pattern and (nodeFunc.called.bridge or nodeFunc.called.canvas) then&lt;br /&gt;
							step = step + 1&lt;br /&gt;
						end&lt;br /&gt;
						m.num = m.num + 1&lt;br /&gt;
						step = step + (p.omit_blanks and 0 or m.showBox)&lt;br /&gt;
						bumps = bumps + (col.show3rd and 0 or maxSpan(p.span, m.r, rows))&lt;br /&gt;
					end&lt;br /&gt;
				elseif m.phase == 0 then&lt;br /&gt;
					if nodeFunc.pattern then&lt;br /&gt;
						for x, y in ipairs(nodeFunc.pattern) do&lt;br /&gt;
							if nodeFunc[y] and nodeFunc[y].main then&lt;br /&gt;
								nodeFunc.called[y] = nodeFunc[y].main(x)&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						if m.available == false then&lt;br /&gt;
							m.showBox = nodeArgs.blank&lt;br /&gt;
							step = step + 1&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if m.showBox[1] then&lt;br /&gt;
						if col.show3rd then&lt;br /&gt;
							col.show3rd = (m.num - col.top) * 2&lt;br /&gt;
							if col.show3rd == 2 then&lt;br /&gt;
								if p.textThird:match(&amp;#039;omit_label&amp;#039;) then&lt;br /&gt;
									p.textThird = nil&lt;br /&gt;
								end&lt;br /&gt;
								if rowNum[rows + 1] and p.cols &amp;gt; 1 then --if 3rd place extends below bottom cell&lt;br /&gt;
									rowNum[rows + 1]:tag&amp;#039;td&amp;#039;:attr{&lt;br /&gt;
										rowspan = m.r + 9 - rows - (text and 0 or 2),&lt;br /&gt;
										colspan = (p.cols - 1) * (3 + p.scoreBoxes)&lt;br /&gt;
									}&lt;br /&gt;
								end&lt;br /&gt;
								if p.tCols == 1 then&lt;br /&gt;
									bumps = p.textThird and 3 or 0&lt;br /&gt;
								elseif p.branch_upwards then&lt;br /&gt;
									r = 7&lt;br /&gt;
									bumps = p.textThird and 2 or 0&lt;br /&gt;
								end&lt;br /&gt;
								m.r = r + bumps&lt;br /&gt;
								if p.textThird then&lt;br /&gt;
									drawHead(p.textThird, m.r)&lt;br /&gt;
									bumps = bumps + 2&lt;br /&gt;
									m.r = r + bumps&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						dpBox(nodeFunc.pattern and nodeFunc.nonFunc or args[step], m.r)&lt;br /&gt;
						if p.previewnumbers then					&lt;br /&gt;
							rowNum[m.r].nodes[#rowNum[m.r].nodes]&lt;br /&gt;
								:tag&amp;#039;div&amp;#039;&lt;br /&gt;
									:css{&lt;br /&gt;
										float = &amp;#039;left&amp;#039;,&lt;br /&gt;
										border = &amp;#039;1px solid red&amp;#039;,&lt;br /&gt;
										padding = &amp;#039;0 .5ex&amp;#039;,&lt;br /&gt;
										[&amp;#039;color&amp;#039;] = &amp;#039;red&amp;#039;&lt;br /&gt;
									}&lt;br /&gt;
									:wikitext(m.num)&lt;br /&gt;
									:attr{title = &amp;#039;Number only visible outside article space (e.g. template) when |numberpreview=yes&amp;#039;}&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if p.colspan then&lt;br /&gt;
						m.nonEmpty = {}&lt;br /&gt;
						for s = step + 2, step + nodeArgs.team.offset do&lt;br /&gt;
							local i = {s, s + nodeArgs.team.offset}&lt;br /&gt;
							if args[i[1]] or args[i[2]] then&lt;br /&gt;
								table.insert(m.nonEmpty, i)&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						if p.bold and m.showBox[2] and m.showBox[3] and not unBold[m.num] then&lt;br /&gt;
							m.bold = {&lt;br /&gt;
								box = {},&lt;br /&gt;
								clean = {}&lt;br /&gt;
							}&lt;br /&gt;
							local notSummed = not p.scoreSumBox or #m.nonEmpty &amp;lt; 2&lt;br /&gt;
							for s, i in ipairs(m.nonEmpty) do&lt;br /&gt;
								m.bold.clean[s] = {p.scoreWasher:main(args[i[1]]), p.scoreWasher:main(args[i[2]])}&lt;br /&gt;
								m.bold.box[s] = notSummed and boldWin(m.bold.clean[s][1], m.bold.clean[s][2]) or callableEmpty&lt;br /&gt;
							end&lt;br /&gt;
							if p.scoreSumBox and m.nonEmpty[2] then&lt;br /&gt;
								local i = {-step, -step - 1}&lt;br /&gt;
								table.insert(m.nonEmpty, i)&lt;br /&gt;
								args[i[1]], args[i[2]] = p.scoreWasher.sum(m.bold.clean)&lt;br /&gt;
								m.bold.box[p.scoreBoxes] = boldWin(args[i[1]], args[i[2]])&lt;br /&gt;
							end&lt;br /&gt;
							getmetatable(boxStyle).__index = p.scoreSumBoxes and {[#m.nonEmpty] = boxStyle[p.scoreBoxes]}&lt;br /&gt;
							m.bold.win = m.bold.box[#m.nonEmpty] or callableEmpty&lt;br /&gt;
						else&lt;br /&gt;
							m.bold = infiniteEmpty&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					if m.showBox[m.phase] then&lt;br /&gt;
						if col.color_repechage then&lt;br /&gt;
							col.color_repechage = 2&lt;br /&gt;
						end&lt;br /&gt;
						if p.bold then&lt;br /&gt;
							if m.bold.win(m.phase) and (colorFinal or col.color_repechage)  then&lt;br /&gt;
								color_index = 1 + (col.show3rd or 0) + (col.color_repechage or 0)&lt;br /&gt;
							elseif m.bold.box[#m.nonEmpty] then &lt;br /&gt;
								color_index = 2 + (col.show3rd or 0) + (col.color_repechage or 0)&lt;br /&gt;
							else&lt;br /&gt;
								color_index = 4&lt;br /&gt;
							end&lt;br /&gt;
							p.teamBoxCSS = (colorFinal or col.color_repechage) and&lt;br /&gt;
								{border = p.teamBoxNormal.border, [&amp;#039;background-color&amp;#039;] = p.bgColor[color_index], color = p.textColor[color_index]}&lt;br /&gt;
								or p.teamBoxNormal&lt;br /&gt;
						else&lt;br /&gt;
							p.teamBoxCSS = (colorFinal or col.color_repechage) and&lt;br /&gt;
								{border = p.teamBoxNormal.border, [&amp;#039;background-color&amp;#039;] = p.bgColor[m.phase + (col.show3rd or 0) + (col.color_repechage or 0)], color = p.textColor[m.phase + (col.show3rd or 0) + (col.color_repechage or 0)]}&lt;br /&gt;
								or p.teamBoxNormal&lt;br /&gt;
						end&lt;br /&gt;
						local f = {phase = m.phase, bold = m.bold.win(m.phase)}&lt;br /&gt;
						teamBox(args[step + nodeArgs.team[m.phase]], m.r, f)&lt;br /&gt;
						f[1] = &amp;#039;center&amp;#039;&lt;br /&gt;
						if p.colspan then&lt;br /&gt;
							if m.nonEmpty[1] then&lt;br /&gt;
								local loneSum&lt;br /&gt;
								if #m.nonEmpty &amp;lt; p.scoreBoxes then&lt;br /&gt;
									loneSum = #m.nonEmpty == 1 and boxStyle[p.scoreBoxes]&lt;br /&gt;
									tab.r:attr{colspan = 1 + p.scoreBoxes - #m.nonEmpty}&lt;br /&gt;
								end&lt;br /&gt;
								for s, i in ipairs(m.nonEmpty) do&lt;br /&gt;
									f.borderLeft = boxStyle(s)&lt;br /&gt;
									f.sumBox = loneSum or boxStyle[s]&lt;br /&gt;
									f.bold = m.bold.box[s](m.phase)&lt;br /&gt;
									teamBox(args[i[m.phase]], m.r, f)&lt;br /&gt;
								end&lt;br /&gt;
							else&lt;br /&gt;
								for s = 1, p.scoreBoxes do&lt;br /&gt;
									f.borderLeft = boxStyle(s)&lt;br /&gt;
									teamBox(nil, m.r, f)&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if m.phase == 2 then&lt;br /&gt;
						col.show3rd = col.show3rd ~= 2 and col.show3rd or nil&lt;br /&gt;
						if p.scoreWasher.demo and p.scoreWasher.demo == m.num and p.namespace ~= 0 then&lt;br /&gt;
							table.insert(m.bold.clean, 1, {args[step + nodeArgs.team[1]], args[step + nodeArgs.team[2]]})&lt;br /&gt;
							return table.concat{&lt;br /&gt;
								&amp;#039;Score data for match specified by &amp;lt;code&amp;gt;|demoWash=&amp;lt;/code&amp;gt;:&amp;lt;br&amp;gt;&amp;#039;,&lt;br /&gt;
								mw.dumpObject{scores = m.bold.clean, cycles = p.scoreWasher.cycles, sum = p.scoreSumBox and {m.nonEmpty[#m.nonEmpty][1], m.nonEmpty[#m.nonEmpty][1]}},&lt;br /&gt;
								&amp;#039;&amp;lt;table&amp;gt;&amp;#039;,&lt;br /&gt;
								tostring(sp.row), &amp;#039;&amp;lt;tr&amp;gt;&amp;#039;,&lt;br /&gt;
								tostring(rowNum[m.r - 4]), &amp;#039;&amp;lt;tr&amp;gt;&amp;#039;,&lt;br /&gt;
								tostring(rowNum[m.r - 2]), &amp;#039;&amp;lt;tr&amp;gt;&amp;#039;,&lt;br /&gt;
								tostring(rowNum[m.r]), &amp;#039;&amp;lt;/table&amp;gt;&amp;#039;,&lt;br /&gt;
							}&lt;br /&gt;
						end&lt;br /&gt;
						if nodeFunc.orphan.num == m.num then&lt;br /&gt;
							skipMatch[m.num] = &amp;#039;orphan&amp;#039;&lt;br /&gt;
						end&lt;br /&gt;
						step = step + m.showBox&lt;br /&gt;
						m.num = m.num + 1&lt;br /&gt;
						if bump &amp;gt; 0 and rowNum[m.r + 2] and not (nodeFunc.pattern and nodeFunc.called.canvas) then&lt;br /&gt;
							bumps = bumps + p.span&lt;br /&gt;
							rowNum[m.r + 2]:node(bumpMid)&lt;br /&gt;
						end&lt;br /&gt;
						r = r + (col.show3rd or bump)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				m.phase = (m.phase + 1) % 3&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if p.cols &amp;gt; c then--draw lines to next round&lt;br /&gt;
			p.unit = bump + 3&lt;br /&gt;
			bump = 3 * math.pow(2, c) - 3&lt;br /&gt;
			bumps = p.branch_upwards and 4 or (p.unit + 1)&lt;br /&gt;
			rowNum[1]&lt;br /&gt;
				:tag&amp;#039;td&amp;#039;:attr{rowspan = bumps}&lt;br /&gt;
			if not p.branch_upwards then&lt;br /&gt;
				rowNum[1]:tag&amp;#039;td&amp;#039;&lt;br /&gt;
					:attr{rowspan = (p.branch_upwards or bump) + 4}&lt;br /&gt;
					:css(nodeFunc.bridge.lay[c](0) and&lt;br /&gt;
						{[&amp;#039;border-right&amp;#039;] = p.reuseStr.solid}&lt;br /&gt;
						or {}&lt;br /&gt;
					)&lt;br /&gt;
			end&lt;br /&gt;
			col.n = 0&lt;br /&gt;
			col.t2 = nil&lt;br /&gt;
			for r = bumps + 1, rows, p.unit * 2 do&lt;br /&gt;
				tab.r = rowNum[r]:tag&amp;#039;td&amp;#039;&lt;br /&gt;
				local interval = ((r - bumps - 1) / (p.unit * 2)) % 4&lt;br /&gt;
				if interval % 2 == 0 then&lt;br /&gt;
					--col.t and col.t2 control whether lines are drawn&lt;br /&gt;
					col.t = col.t2 or skipMatch[col.tot + col.n / 2 + 1] and 3 or ((skipMatch[col.top] and 1 or 0) + (skipMatch[col.top + 1] and 2 or 0))&lt;br /&gt;
					col.n = col.n + 2&lt;br /&gt;
					col.t2 = skipMatch[col.tot + col.n / 2 + 1] and 3 or ((skipMatch[col.top + col.n] and 1 or 0) + (skipMatch[col.top + col.n + 1] and 2 or 0))&lt;br /&gt;
					if col.t == 0 then --draws the &amp;#039;]&amp;#039; when a PAIR of matches needs lines&lt;br /&gt;
						tab.r&lt;br /&gt;
							:attr{rowspan = maxSpan(p.unit * 2, r, rows)}&lt;br /&gt;
							:css(skipMatch[col.tot + col.n / 2] and {} or {&lt;br /&gt;
								border = p.reuseStr.solid,&lt;br /&gt;
								[&amp;#039;border-left&amp;#039;] = 0&lt;br /&gt;
							})&lt;br /&gt;
					else --draws the lines when only top OR bottom match need lines&lt;br /&gt;
						tab.r&lt;br /&gt;
							:attr{rowspan = maxSpan(p.unit, r, rows)}&lt;br /&gt;
							:cssText(col.t == 2 and&lt;br /&gt;
								p:saveStr(&amp;#039;topRight&amp;#039;, &amp;#039;border-width:&amp;#039;, tab.line[2], &amp;#039; 0 0;border-style:solid&amp;#039;)&lt;br /&gt;
								or col.t == 1 and (nodeFunc.bridge.lay[c](col.n - 2) and&lt;br /&gt;
									p:saveStr(&amp;#039;right&amp;#039;, &amp;#039;;border-right:&amp;#039;, p.reuseStr.solid)&lt;br /&gt;
									or &amp;#039;vertical-align:bottom&amp;#039;&lt;br /&gt;
								)&lt;br /&gt;
								or nil&lt;br /&gt;
							)&lt;br /&gt;
							:node(col.t == 1 and interval &amp;gt; 0 and not nodeFunc.bridge.lay[c](col.n - 2) and p.cornerDiv)&lt;br /&gt;
						rowNum[r + (p.branch_upwards and (4 - bump) or p.unit)]:tag&amp;#039;td&amp;#039;&lt;br /&gt;
							:attr{rowspan = maxSpan(p.unit, r + p.unit, rows)}&lt;br /&gt;
							:cssText(col.t == 1 and&lt;br /&gt;
								p:saveStr(&amp;#039;bttmRght&amp;#039;, &amp;#039;border-width:0 &amp;#039;, tab.line[2], &amp;#039; 0;border-style:solid&amp;#039;)&lt;br /&gt;
								or col.t == 2 and (nodeFunc.bridge.lay[c](col.n + 2) and&lt;br /&gt;
									p:saveStr(&amp;#039;right&amp;#039;, &amp;#039;;border-right:&amp;#039;, p.reuseStr.solid)&lt;br /&gt;
									or &amp;#039;vertical-align:top&amp;#039;&lt;br /&gt;
								)&lt;br /&gt;
								or nil&lt;br /&gt;
							)&lt;br /&gt;
							:node(col.t == 2 and interval ~= 2 and not nodeFunc.bridge.lay[c](col.n + 2) and p.cornerDiv)&lt;br /&gt;
					end&lt;br /&gt;
					col.t = {&lt;br /&gt;
						col.t &amp;lt; 3,&lt;br /&gt;
						rowNum[r + p.unit * 5] and col.t2 &amp;lt; 3 or false&lt;br /&gt;
					}&lt;br /&gt;
					rowNum[r + (p.branch_upwards or p.unit)]:tag&amp;#039;td&amp;#039;&lt;br /&gt;
						:attr{rowspan = maxSpan(p.unit * 4, r + (p.branch_upwards and (4 - bump) or p.unit), rows)}&lt;br /&gt;
						:css(interval == 0 and (col.t[1] or col.t[2]) and {&lt;br /&gt;
							[&amp;#039;border-width&amp;#039;] = table.concat{tab.line[1][col.t[1]], &amp;#039; 0 &amp;#039;, tab.line[1][col.t[2]]},&lt;br /&gt;
							[&amp;#039;border-style&amp;#039;] = &amp;#039;solid&amp;#039;&lt;br /&gt;
						} or {})&lt;br /&gt;
				else&lt;br /&gt;
					tab.r&lt;br /&gt;
						:attr{rowspan = maxSpan(p.unit * 2, r, rows)}&lt;br /&gt;
						:css(nodeFunc.bridge.lay[c](col.n) and&lt;br /&gt;
							{[&amp;#039;border-right&amp;#039;] = p.reuseStr.solid}&lt;br /&gt;
							or {}&lt;br /&gt;
						)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local lock_height = (head_br.count or 0) + 1&lt;br /&gt;
	return args.scroll_height and&lt;br /&gt;
		mw.html.create&amp;#039;div&amp;#039;&lt;br /&gt;
			:cssText&amp;#039;border-bottom:1px solid #eee;display:inline-block&amp;#039;&lt;br /&gt;
			:node(not (p.scroll_head_unlock or p.no_column_head) and mw.html.create&amp;#039;div&amp;#039;&lt;br /&gt;
				:css{&lt;br /&gt;
					overflow = &amp;#039;hidden&amp;#039;,&lt;br /&gt;
					height = lock_height * 1.4 + 1.6 .. &amp;#039;em&amp;#039;,&lt;br /&gt;
					[&amp;#039;border-bottom&amp;#039;] = &amp;#039;inherit&amp;#039;,&lt;br /&gt;
					[&amp;#039;margin-right&amp;#039;] = &amp;#039;17px&amp;#039;&lt;br /&gt;
				}&lt;br /&gt;
				:node(mw.clone(tab))&lt;br /&gt;
			)&lt;br /&gt;
			:tag&amp;#039;div&amp;#039;&lt;br /&gt;
				:css{&lt;br /&gt;
					[&amp;#039;overflow-y&amp;#039;] = &amp;#039;scroll&amp;#039;,&lt;br /&gt;
					[&amp;#039;max-height&amp;#039;] = tonumber(args.scroll_height, 10) and args.scroll_height .. &amp;#039;px&amp;#039; or args.scroll_height&lt;br /&gt;
				}&lt;br /&gt;
				:node(not (p.scroll_head_unlock or p.no_column_head) and&lt;br /&gt;
					tab:css{[&amp;#039;margin-top&amp;#039;] = math.floor(-10 * (lock_height * 1.4 + 1.6)/(fontSize or .9)) / 10 .. &amp;#039;em&amp;#039;, [&amp;#039;padding-top&amp;#039;] = &amp;#039;-3px&amp;#039;}&lt;br /&gt;
					or tab&lt;br /&gt;
				)&lt;br /&gt;
			:done()&lt;br /&gt;
		or tab&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[local standard = {&lt;br /&gt;
	&amp;#039;beta&amp;#039; = {&lt;br /&gt;
		bold_winner = &amp;#039;high&amp;#039;,&lt;br /&gt;
		omit_blanks = &amp;#039;yes&amp;#039;,&lt;br /&gt;
		auto_3rd = &amp;#039;yes&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
}--]]&lt;br /&gt;
function p.main(frame, columns)&lt;br /&gt;
	local args = require&amp;#039;Module:Arguments&amp;#039;.getArgs(frame, {trim = false})&lt;br /&gt;
	args.columns = args.columns or columns&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.seed(frame)&lt;br /&gt;
	local parent = frame:getParent() or frame&lt;br /&gt;
	local function arg(k, alt)&lt;br /&gt;
		return parent.args[k] or frame.args[k] or alt&lt;br /&gt;
	end&lt;br /&gt;
	local padding, width = arg(2, p.teamBoxPadding()), arg(3, arg(&amp;#039;widescore&amp;#039;) and 40 or 30)&lt;br /&gt;
	padding = tonumber(padding) and tonumber(padding) .. &amp;#039;px&amp;#039; or padding&lt;br /&gt;
	width = tonumber(width) and tonumber(width) .. &amp;#039;px&amp;#039; or width&lt;br /&gt;
	return mw.html.create&amp;#039;div&amp;#039;&lt;br /&gt;
		:css{&lt;br /&gt;
			margin = (&amp;#039;-1px %s -1px -0.7ex&amp;#039;):format(padding, padding),&lt;br /&gt;
			float = &amp;#039;left&amp;#039;,&lt;br /&gt;
			[&amp;#039;background-color&amp;#039;] = p.bgColor.head,&lt;br /&gt;
			border = &amp;#039;1px solid #aaa&amp;#039;,&lt;br /&gt;
			color = p.textColor.head,&lt;br /&gt;
			[&amp;#039;text-align&amp;#039;] = &amp;#039;center&amp;#039;,&lt;br /&gt;
			width = width&lt;br /&gt;
		}&lt;br /&gt;
		:wikitext(arg(1, &amp;#039;&amp;amp;nbsp;&amp;#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Mob</name></author>
	</entry>
</feed>