<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://nssportwiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Osarius</id>
	<title>NationStates Sports Wiki - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://nssportwiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Osarius"/>
	<link rel="alternate" type="text/html" href="https://nssportwiki.com/wiki/Special:Contributions/Osarius"/>
	<updated>2026-11-08T15:32:09Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Glossary_of_football_slang_terms&amp;diff=76987</id>
		<title>Glossary of football slang terms</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Glossary_of_football_slang_terms&amp;diff=76987"/>
		<updated>2026-10-15T15:55:14Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{compact ToC|side=yes|num=yes|seealso=yes|refs=yes}} ==A== * &amp;#039;&amp;#039;&amp;#039;Agrikùn&amp;#039;&amp;#039;&amp;#039; &amp;amp;ndash; &amp;#039;&amp;#039;Origin: {{flag|Akach}}&amp;#039;&amp;#039; &amp;lt;br /&amp;gt; Meaning &amp;quot;farmer athlete&amp;quot;. Refers to a &amp;quot;no nonsense&amp;quot; type player who does the job as simply as possible, but effectively. Usually a defender. * &amp;#039;&amp;#039;&amp;#039;Angry shadow&amp;#039;&amp;#039;&amp;#039; &amp;amp;ndash; &amp;#039;&amp;#039;Origin: {{flag|Cobrio}}&amp;#039;&amp;#039; &amp;lt;br /&amp;gt; See Piano carrier. ==B== * &amp;#039;&amp;#039;&amp;#039;Ball tamer&amp;#039;&amp;#039;&amp;#039; &amp;lt;br /&amp;gt; See (to) tame the ball. * &amp;#039;&amp;#039;&amp;#039;Before coffee&amp;#039;&amp;#039;&amp;#039; &amp;lt;br /&amp;gt; A bad performance typified by low...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{compact ToC|side=yes|num=yes|seealso=yes|refs=yes}}&lt;br /&gt;
==A==&lt;br /&gt;
* &#039;&#039;&#039;Agrikùn&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Akach}}&#039;&#039; &amp;lt;br /&amp;gt; Meaning &amp;quot;farmer athlete&amp;quot;. Refers to a &amp;quot;no nonsense&amp;quot; type player who does the job as simply as possible, but effectively. Usually a defender.&lt;br /&gt;
* &#039;&#039;&#039;Angry shadow&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Cobrio}}&#039;&#039; &amp;lt;br /&amp;gt; See [[#P|Piano carrier]].&lt;br /&gt;
==B==&lt;br /&gt;
* &#039;&#039;&#039;Ball tamer&#039;&#039;&#039; &amp;lt;br /&amp;gt; See [[#T|(to) tame the ball]].&lt;br /&gt;
* &#039;&#039;&#039;Before coffee&#039;&#039;&#039; &amp;lt;br /&amp;gt; A bad performance typified by low energy. Implies the player needs a coffee (or similar drink) to &amp;quot;wake up&amp;quot;, or some sort of energy boost.&lt;br /&gt;
* &#039;&#039;&#039;Butterfly hunter&#039;&#039;&#039; &amp;lt;br /&amp;gt; A goalkeeper who has misjudged the flight of the ball, and &amp;quot;flaps&amp;quot; at it with both hands, only to come up empty handed.&lt;br /&gt;
==C==&lt;br /&gt;
* &#039;&#039;&#039;Canoe foot&#039;&#039;&#039; &amp;lt;br /&amp;gt; A player who is inaccurate in front of goal, or has a poor first touch. The phrase implies this is because they have long feet.&lt;br /&gt;
* &#039;&#039;&#039;Cat chasing a fly&#039;&#039;&#039; &amp;lt;br /&amp;gt; See [[#B|Butterfly hunter]].&lt;br /&gt;
* &#039;&#039;&#039;(to) chop before breakfast&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Cobrio}}&#039;&#039; &amp;lt;br /&amp;gt; An accomplished performance that looks effortless, languid, or otherwise slow. The phrase implies the player has not fully woken up yet, but is still able to &amp;quot;cook&amp;quot;.&lt;br /&gt;
==D==&lt;br /&gt;
* &#039;&#039;&#039;(to) dance at (multiple) weddings&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Cobrio}}&#039;&#039; &amp;lt;br /&amp;gt; To do well in multiple competitions at once.&lt;br /&gt;
* &#039;&#039;&#039;(to) dig under the mountain&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Osarius}}&#039;&#039; &amp;lt;br /&amp;gt; To bring through talented young players. Also called &amp;quot;making glass&amp;quot; in [[Tubriss (Osarius)|Tubriss]].&lt;br /&gt;
==E==&lt;br /&gt;
* &#039;&#039;&#039;Enyagha&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Cobrio}}&#039;&#039; &amp;lt;br /&amp;gt; See [[#W|War elephant]].&lt;br /&gt;
* &#039;&#039;&#039;Erinogun&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Cobrio}}&#039;&#039; &amp;lt;br /&amp;gt; See [[#W|War elephant]].&lt;br /&gt;
* &#039;&#039;&#039;Eristicean horse&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Osarius}}&#039;&#039; &amp;lt;br /&amp;gt; Also sometimes referred to as an &#039;&#039;&#039;&#039;&#039;Erisian horse&#039;&#039;&#039;&#039;&#039;. A team that starts well but falls away toward the end of a competition. So called because [[Eristicea|Eristiceans]] are stereotyped as grifters and fraudsters.&lt;br /&gt;
==F==&lt;br /&gt;
* &#039;&#039;&#039;Fur&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Novum-castrum}}&#039;&#039; &amp;lt;br /&amp;gt; Meaning [[#T|Thief]]. &lt;br /&gt;
==H==&lt;br /&gt;
* &#039;&#039;&#039;Hungry child&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Cobrio}}&#039;&#039; &amp;lt;br /&amp;gt; A ball hog.&lt;br /&gt;
==I==&lt;br /&gt;
* &#039;&#039;&#039;(in the) Ice&#039;&#039;&#039; &amp;lt;br /&amp;gt; A player left out of the team after a bad performance.&lt;br /&gt;
==K==&lt;br /&gt;
* &#039;&#039;&#039;Kléftis&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Eristicea}}&#039;&#039;&amp;lt;br /&amp;gt; Meaning [[#T|Thief]]. &lt;br /&gt;
==L==&lt;br /&gt;
* &#039;&#039;&#039;Ladrón&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Aquillian}}&#039;&#039; &amp;lt;br /&amp;gt; Meaning [[#T|Thief]]. &lt;br /&gt;
* &#039;&#039;&#039;Lleidr&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Diwedd Ardal}}&#039;&#039; &amp;lt;br /&amp;gt; Meaning [[#T|Thief]]. &lt;br /&gt;
* &#039;&#039;&#039;(to) lock the door&#039;&#039;&#039; &amp;lt;br /&amp;gt; To adopt an ultra-defensive strategy. Like &amp;quot;parking the bus&amp;quot; in English.&lt;br /&gt;
* &#039;&#039;&#039;Lumberjack&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|The Limey Isles}}&#039;&#039; &amp;lt;br /&amp;gt; A violent ball-winner. A &amp;quot;hatchet man&amp;quot;.&lt;br /&gt;
==M==&lt;br /&gt;
* &#039;&#039;&#039;(to) make a cloud&#039;&#039;&#039; &amp;lt;br /&amp;gt; A hopeful long aerial punt into the box, particularly late in the game. So named because the ball falls like rain from a cloud.&lt;br /&gt;
* &#039;&#039;&#039;(to) make glass&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Osarius}}&#039;&#039; &amp;lt;br /&amp;gt; A Tubrissian variation of [[#D|Digging under a mountain]].&lt;br /&gt;
==O==&lt;br /&gt;
* &#039;&#039;&#039;Onyo!&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Cobrio}}&#039;&#039; &amp;lt;br /&amp;gt; Truncation of &amp;quot;onye ohi&amp;quot;, meaning [[#T|Thief]]. &lt;br /&gt;
==P==&lt;br /&gt;
* &#039;&#039;&#039;(to) Paint (with the toe)&#039;&#039;&#039; &amp;lt;br /&amp;gt; A beautiful piece of play that could be considered &amp;quot;art&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Piano carrier&#039;&#039;&#039; &amp;lt;br /&amp;gt; A hardworking player who does the dirty work, so that a more talented teammate can shine. Variants on this phrase exist, referring to other bulky musical instruments.&lt;br /&gt;
* &#039;&#039;&#039;(to) piss in the wine&#039;&#039;&#039; &amp;lt;br /&amp;gt; To beat a team who have just won a trophy, thus spoiling their party.&lt;br /&gt;
* &#039;&#039;&#039;(to) play in a suit&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Akach}}&#039;&#039; &amp;lt;br /&amp;gt; A deceptive performance (e.g. trying to get a player sent off), insinuating that people in suits are untrustworthy. Commonly used in [[Akach]] (Akachese: &#039;&#039;láti ṣeré nígbà tí a wọ̀ ọ́ aṣọ iṣowo&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;Plank&#039;&#039;&#039; &amp;lt;br /&amp;gt; Used to refer to any formation with &amp;quot;two banks of four&amp;quot; (e.g. 4-4-2, 4-4-1-1, 4-6-0, etc). Because it&#039;s &amp;quot;two-by-four&amp;quot;.&lt;br /&gt;
==R==&lt;br /&gt;
* &#039;&#039;&#039;(to) reverse (the shirt/colours)&#039;&#039;&#039;&amp;lt;br /&amp;gt;Used to refer to a player leaving a club to join a rival.&lt;br /&gt;
==S==&lt;br /&gt;
* &#039;&#039;&#039;(to) set the grass on fire&#039;&#039;&#039; &amp;lt;br /&amp;gt; To play very intensely. Usually said at half time during a boring match or after a disappointing performance. &amp;quot;They will have to set the grass on fire in the second half&amp;quot;, meaning they will need to &amp;quot;up their game&amp;quot; significantly.&lt;br /&gt;
* &#039;&#039;&#039;Shaving paint&#039;&#039;&#039; &amp;lt;br /&amp;gt; To hit the post or bar.&lt;br /&gt;
* &#039;&#039;&#039;Shoeshiner&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Osarius}}&#039;&#039; &amp;lt;br /&amp;gt; See [[#P|Piano carrier]].&lt;br /&gt;
* &#039;&#039;&#039;Shuttle train&#039;&#039;&#039; &amp;lt;br /&amp;gt; A player who runs up and down the pitch a lot. Typically a fullback or wingback.&lt;br /&gt;
* &#039;&#039;&#039;(to) start the dance&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Aquillian}}&#039;&#039; &amp;lt;br /&amp;gt; Dribbling aggressively toward someone, creating a one-on-one situation.&lt;br /&gt;
* &#039;&#039;&#039;(to) squeeze sand&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Osarius}}&#039;&#039; &amp;lt;br /&amp;gt; Originating in the Tubriss region of Osarius, used to refer to a manager persisting with the selection of an out of form player. Sometimes the phrase &amp;quot;(to) squeeze a stone&amp;quot; is used in other regions.&lt;br /&gt;
==T==&lt;br /&gt;
* &#039;&#039;&#039;(to) tame the ball&#039;&#039;&#039; &amp;lt;br /&amp;gt; To master the fundamentals of the sport.&lt;br /&gt;
* &#039;&#039;&#039;Thief!&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: Various&#039;&#039; &amp;lt;br /&amp;gt; A shout made&amp;amp;mdash;typically in a player&#039;s native language&amp;amp;mdash;to warn a teammate that an opponent is approaching to make a tackle, similar to the colloquial English &amp;quot;man on!&amp;quot;. See also: [[#F|Fur]], [[#K|Kléftis]], [[#L|Ladrón]], [[#L|Lleidr!]], and [[#O|Onyo!]].&lt;br /&gt;
* &#039;&#039;&#039;Tukarist(a/o)&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Aquillian}}&#039;&#039; &amp;lt;br /&amp;gt; A hardworking, selfless player. Typically an attacker. Refers to the philosophy of [[Tukarism]], named for revolutionary [[Cobrio|Cobre]] leader [[Tukari Kaita]].&lt;br /&gt;
==W==&lt;br /&gt;
* &#039;&#039;&#039;War elephant&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Cobrio}}&#039;&#039; &amp;lt;br /&amp;gt; A striker who leads the line aggressively, relying on physicality and brute force. Typically known as &#039;&#039;&#039;&#039;&#039;Enyagha&#039;&#039;&#039;&#039;&#039; or &#039;&#039;&#039;&#039;&#039;Erinogun&#039;&#039;&#039;&#039;&#039; within Cobrio (both phrases translate to &amp;quot;war elephant&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;Where the joiner works&#039;&#039;&#039; &amp;amp;ndash; &#039;&#039;Origin: {{flag|Akach}}&#039;&#039; &amp;lt;br /&amp;gt; A shot placed right in the top corner of the goal, near the angle of post and bar. Also known as &#039;&#039;&#039;&amp;quot;where the bat sleeps&amp;quot;&#039;&#039;&#039; in [[The Limey Isles]], or &#039;&#039;&#039;&amp;quot;in the spider&#039;s web&amp;quot;&#039;&#039;&#039; or &#039;&#039;&#039;&amp;quot;shaving paint twice&amp;quot;&#039;&#039;&#039; in other places.&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Glossary_of_Cobre_creole_phrases&amp;diff=76972</id>
		<title>Glossary of Cobre creole phrases</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Glossary_of_Cobre_creole_phrases&amp;diff=76972"/>
		<updated>2026-10-14T15:51:13Z</updated>

		<summary type="html">&lt;p&gt;Osarius: /* E */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{compact ToC|side=yes|num=yes|seealso=yes|refs=yes}}&lt;br /&gt;
==A==&lt;br /&gt;
* &#039;&#039;&#039;Abojutolu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Meaning &amp;quot;without supervision&amp;quot; (&amp;quot;abojuto&amp;quot; = supervision; &amp;quot;lu&amp;quot; modifier to denote absence), this is the name given to a line of automatons developed by [[Ipele Prossimo Humanité]] (IPH) to perform menial labour tasks. They are so-named, as they do not require any human supervision, and a workforce of thousands can easily be managed by a single [[#A|amami eziolu]] system. These automatons are rarely given powerful operating systems themselves, and will normally have hardware designed for lower level amami eziolu, more specialised to their specific task; as a result, they are not often suited to perform other tasks. They often include a system which incorporates eluvium in order to maximise their capacity for lifting, carrying, and transporting material; as these are tasks identified by researchers as having the highest human cost (i.e. high rate of injury among human workers).&lt;br /&gt;
* &#039;&#039;&#039;Adinkra&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Symbols used in Cobre tradition to confer certain attributes upon the wearer/bearer, or to represent certain ideals and concepts. Most commonly seen in clothing patterns, or as symbols painted onto the skin or uniforms of those who enter competitive scenarios. Originally, the adinkra were reserved only for battle and trials, but their use has become more and more widespread over the years.&lt;br /&gt;
* &#039;&#039;&#039;Agricole&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A portmanteau of &amp;quot;agriculture&amp;quot; and &amp;quot;école&amp;quot; ([[Azertienne language|Azertienne]] for &amp;quot;school&amp;quot;). An institution of higher education (most commonly found in [[Cobrio]] or [[Akach]]) which combines vocational training with scientific research, centred on advancing agricultural methods and processes through a combination of traditional wisdom and modern science and technology.&lt;br /&gt;
* &#039;&#039;&#039;Ahonelu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Meaning &amp;quot;elevated tongue&amp;quot;, it refers to a ritual language used in [[Ipanism]]. It is a sort of pidgin derived from [[Cobre Creole]] and modern Akachese (itself carrying some similarities to [[Azertienne language|Azertienne]]). Sometimes also called &#039;&#039;edenrin&#039;&#039; (&amp;quot;language of the siblings&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;Akaba&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; literally meaning &amp;quot;ladder&amp;quot;. It is often used to describe any structure that resembles a ladder, or that allows progressive movement (often based on merit). A related slang term, &#039;&#039;&amp;quot;[[#L|lukaba]]&amp;quot;&#039;&#039;, refers to a system that does not reward based on merit.&lt;br /&gt;
* &#039;&#039;&#039;Akamami&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally meaning &amp;quot;canopy of wisdom&amp;quot;. The covered canopy within the [[#O|Ogbokatoma]] where a representative or speaker can directly address the [[Council of N&#039;Katoma]]. Protocol dictates that only the person standing under the Akamami can address the Council, or other attendees at the Ogbokatoma.&lt;br /&gt;
* &#039;&#039;&#039;[[Akkano people|Akkano]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; One of the ethnic groups, or &amp;quot;tribes&amp;quot;, that make up the Cobre nation. The name comes from the old Cobre for &amp;quot;first&amp;quot;, indicating their presence as the indigenous people of Cobrio (and by extension, [[Osarius]]). They are believed to have originated in what is now the North-East region of Cobrio, and migrated south and west. Notably among Cobre people, the Akkano practice [[wikipedia:matrilineality|matrilineality]], with possessions, names etc being passed down from mother to child&amp;amp;mdash;as opposed to the more common patrilineality; inheritance through father to child. Akkano people believe that all are born into a house (&amp;quot;[[#T|Turu]]&amp;quot;) which links you to others in the same house (regardless of ethnicity) on a spiritual level. All people are therefore formed by the effect of their mother&#039;s blood (their inherited traits, or &amp;quot;[[#O|Ogya]]&amp;quot;) upon their &amp;quot;house&amp;quot;. The two terms combined form the name of a uniquely Akkano method of personality analysis (&amp;quot;[[#O|Ogyaturu]]&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;[[Àkoleoso]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally &amp;quot;Koleosoism&amp;quot;, &amp;quot;Koleoso system&amp;quot;, or &amp;quot;the quality of being (like) Koleoso&amp;quot;. A footballing philosophy centred on breaking free of the restrictive nature of most systems. It is named for its main proponent, [[Marvelous Koleoso]].&lt;br /&gt;
* &#039;&#039;&#039;[[Amami eziolu]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Meaning &amp;quot;wisdom without truth&amp;quot;, and sometimes shortened to &amp;quot;AE&amp;quot;. This is the name given to systems developed to emulate human intelligence to a degree. The term was coined by [[Geoffrey Anozie]], lead developer in the artificial intelligence division at [[Ipele Prossimo Humanité]] (IPH), as a means to “remind people what we are doing”. He went on to add that “these systems can never truly emulate the human mind because their perception of reality, of truth, is limited to the parameters we feed them; they are not sentient, no matter how much it feels like they might be.”&lt;br /&gt;
* &#039;&#039;&#039;Àmuluní&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally &amp;quot;the practice of foolish speaking&amp;quot; (mulu = &amp;quot;foolish, easily tricked&amp;quot;, ní = &amp;quot;speech&amp;quot;, À = modifier signifying a practice or system). Commonly used to describe a way of speaking that is designed to trick the listener. Originally a slang term used predominantly in &amp;quot;slum&amp;quot; areas of major cities like Dynapolis, Kronkow, and Camaron to describe the language of street crooks, which was designed to be indecipherable to law enforcement. The term gained wider cultural adoption&amp;amp;mdash;and a broader meaning&amp;amp;mdash;when used in a speech within the [[#A|Akamami]] at the [[#O|Ogbokatoma]] by the [[Tukarist Liberation Front]]&#039;s [[Yobanna Adeyemi]], referring to the rhetoric espoused by the right-populist [[Ṣe Kobu Tayọzọ]] (Make the Nation Excellent Again) movement. Now, the term is used for both the street dialect, and a form of political &amp;quot;[[wikipedia:Doublespeak|doublespeak]]&amp;quot;. Adeyemi claims this was a deliberate move, noting that &amp;quot;the only difference is in the clothing they wear. If you speak kiwani and dress in a combination of Cobre and Ugwu clothing, you are a criminal. But if you wear agbada and speak kiwani on platforms, you are a politician.&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;[[Apergium]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; An element refined from [[Eluvium]], via an energy-intensive process. When a sufficiently large electrical current is passed through a cell of apergium, an &amp;quot;apergitational field&amp;quot; is created, in which the effect of gravity is completely nullified. Apergium is used in some [[Anti-gravity technology|anti-gravity]] machinery and craft manufactured in both Cobrio and Osarius.&lt;br /&gt;
* &#039;&#039;&#039;[[House of Argento|Argento]]&#039;&#039;&#039; &#039;&#039;(ˈɑːr.dʒɛn.toʊ // AA·jen·toh)&#039;&#039; &amp;amp;ndash; Formerly a noble house in Osarius, exiled to the [[Aquillian|Isle of Aquillian]] after losing the [[#W|War of the Metals]] to the [[House of Aurumia]]. The House of Argento had subjugated the Cobre nation but were allegedly willing to grant the Cobre peoples some degree of autonomy once the war was won. This claim is doubted among Cobre scholars, and some go as far as to suggest that the Argento &amp;quot;tricked&amp;quot; the Cobre nation, and adopted the Cobre symbol of the [[Panthera veritus|panther]] for their own as part of the ploy. Others suggest that the Cobre leadership was defeated honourably, and agreed to serve. What is certain is that there was some relationship between the Argento and the Cobre nation prior to the War of the Metals.&lt;br /&gt;
* &#039;&#039;&#039;[[House of Aurumia|Aurumia]]&#039;&#039;&#039; &#039;&#039;(aʊ.rᵿ.ˈmiː.jæ // ow·ruh·MEE·ya)&#039;&#039; &amp;amp;ndash; The ruling family of Osarius. Came into power hundreds of years ago, and consolidated it after defeating their main rivals, the House of Argento in the War of the Metals in the mid-late 21st century. There is a split opinion among the Cobre peoples regarding the Aurumia; the larger portion still believes the Aurumia are &amp;quot;the enemy&amp;quot; following the outcome of the War of the Metals. Others believe the Aurumia liberated the Cobre nation from the Argento, though this claim is weakened by the oppressive conditions many Cobre peoples lived under since the exile of the Argento, and other scholars&#039; claims that the Cobre nation was prosperous under the Argento.&lt;br /&gt;
==B==&lt;br /&gt;
* &#039;&#039;&#039;[[Babbanyawo Kadangare]]&#039;&#039;&#039; &#039;&#039;(bæb.æn.ˈjɑː.woʊ kæ.dæn.ˈgɑː.reɪ // bab·ann·YAH·wo ka·dan·GAH·ray)&#039;&#039; &amp;amp;ndash; The title of babbanyawo kadangare translates to something like &amp;quot;the great flying lizard&amp;quot;, but is understood to mean &amp;quot;dragon&amp;quot;. It is a title awarded to the strongest, fiercest warrior across all the tribes that make up the Cobre nation. A tournament is typically held, adhering to ancient combat rules ([[#K|kensagha]]) to decide who will hold the position. The last champion was [[Tukari Kaita]], whose feats were so esteemed, the position has remained unfilled since his death in the mid-23rd century.&lt;br /&gt;
* &#039;&#039;&#039;Babu-fifike&#039;&#039;&#039; &#039;&#039;(bæb.uː fɪf.ˈiː.keɪ // bab·oo fif·EE·kay)&#039;&#039; &amp;amp;ndash; An approximation of &amp;quot;wingless&amp;quot;. Used by &amp;quot;rebels&amp;quot; and Cobre republicans to mock [[Tukari Kaita]]&#039;s position of [[#B|Babbanyawo Kadangare]] and undermine his authority. It is meant to imply that without the flying aspect of his title, Kaita is simply a &amp;quot;great lizard&amp;quot;. An unattributed quote states &amp;quot;What is a dragon without wings? Its power is in its ability to fly above our heads. Without flight, it only hoards treasures and breathes hot air.&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Banpo&#039;&#039;&#039; &#039;&#039;(ˈbæn.poʊ // BAN poh)&#039;&#039; &amp;amp;ndash; The site of the decisive battle between the [[#A|Argento]] and the [[#A|Aurumia]] during the War of the Metals. It is said to have once housed actual dragons in the [[Dragonpits of Banpo|Dragonpits]], which the Argento used to subjugate the Cobre nation and have them fight on their side against the Aurumia.&lt;br /&gt;
* &#039;&#039;&#039;[[Barrington Douglas]]&#039;&#039;&#039; &#039;&#039;(bær.ɪŋ.tən ˈdʌɡ.ləs // bar·ing·tun dug·lass)&#039;&#039; &amp;amp;ndash; A former colonel of the now-defunct Osarian military&#039;s [[#O|Ohafia]] unit, and cousin to former Osarian [[First Minister (Osarius)|First Minister]], [[George Douglas]]. He rallied several smaller militia groups within [[Dynapolis, Osarius|Dynapolis]] and is credited with starting the modern Cobre independence movement. He was installed as &amp;quot;General&amp;quot; and de facto leader of the &amp;quot;Free Lands of Cobrio&amp;quot; before starting a rebellion against Osarius in the early 23rd century. He went missing and was presumed dead after his plan to militarise Dynapolis and secede from Osarius was halted by [[Jermain Marko]] and [[Noah Drake]].&lt;br /&gt;
* &#039;&#039;&#039;[[Bay of Goats]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The name most Cobre people use for the area of water to the West of Cobrio and North of [[Mriin]]. It was given the name by the Akkano people who noted the prevalence of goats in the land nearby. Goat meat is a common ingredient in Cobre cuisine to the present day.&lt;br /&gt;
* &#039;&#039;&#039;[[Biafrai people|Biafrai]]&#039;&#039;&#039; &#039;&#039;(ˈbiː.æf.raɪ // BEE·aff·rye)&#039;&#039; &amp;amp;ndash; One of the ethnic groups, or &amp;quot;tribes&amp;quot; which make up the Cobre nation. Named for the (now-eroded) bay, extending from the southeastern tip of Cobrio, upon which the people first settled. In old Cobre, &amp;quot;biyafi ra yeyo&amp;quot;, or &amp;quot;the bay of land which moves&amp;quot; was shortened to &amp;quot;biyafira&amp;quot;, eventually &amp;quot;biafra&amp;quot;, and the people adopted the suffix &amp;quot;-i&amp;quot;, denoting &amp;quot;from&amp;quot;. This ultimately distilled to &amp;quot;Biafrai&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Boko&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A common insult meaning someone who is slow-witted, or otherwise lacking &amp;quot;street smarts&amp;quot;. Like many slang insults, it can be intensified by doubling; i.e. &amp;quot;boko-boko&amp;quot; is a more severe kind of &amp;quot;boko&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Boolundu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Meaning &amp;quot;life ball&amp;quot;, it is the name given to the fruit of a large tree found in wet areas and forests in Cobrio, or near streams. The tree produces large, ball-shaped fruit, with a spongy texture when ripe, and lots of seeds. A mature tree in the right conditions can produce fruits year-round, with a total yield of more than thirty per year. Each fruit typically weighs between 7-9 kg when fully mature, and produces approximately half that weight in pulp, and around a twentieth of the weight in seeds after processing. The fruit can be eaten raw, but is usually boiled or roasted; or the pulp is used to make [[#M|mmirilan]]. The seeds&amp;amp;mdash;which have high nutritional value and are rich in vitamins&amp;amp;mdash;can also be dried and eaten, though they are usually ground into a flour, or pressed to produce oil. (OOC: It&#039;s [[wikipedia:Treculia africana|African breadfruit]])&lt;br /&gt;
==C==&lt;br /&gt;
* &#039;&#039;&#039;Camaron&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The capital city of Cobrio. A former Osarian military outpost in the southwest of Cobrio, it was the base of operations for [[Barrington Douglas]]&#039; separatist movement before the move north and into Dynapolis. The concentration of military personnel and equipment made it the perfect staging ground for the secession movement that followed, and [[Tukari Kaita]] named it as capital city once independence was confirmed.&lt;br /&gt;
* &#039;&#039;&#039;Chemin&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; [[Azertienne language|Azertienne]] for &amp;quot;path&amp;quot; or &amp;quot;way&amp;quot;. In [[Ipanism|Ipanist]] tradition, every person has their own &#039;&#039;chemin&#039;&#039;, which always leads to death&amp;amp;mdash;the final destination of all life. It is not pre-determined, but rather you will make choices on your journey that can vary the path. Some stops on the path may be pre-determined, but how and when you reach them is entirely up to you.&lt;br /&gt;
* &#039;&#039;&#039;[[Cobrio]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; An &amp;quot;[[wikipedia:Anglicisation|Osarianised]]&amp;quot; spelling of &amp;quot;kobu rigo&amp;quot; (&amp;quot;the land of the people of the flood&amp;quot;). The traditional name for the lands upon which Cobrio exists. So-called because of the manner in which the populations spread rapidly across the area. Scholars believe that &amp;quot;go&amp;quot; (&amp;quot;people&amp;quot;) became &amp;quot;yo&amp;quot; through a misreading of a written passage.&lt;br /&gt;
* &#039;&#039;&#039;[[Cook-off]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A cooking competition where the contestants each prepare dishes for judging either by a select group of judges or by the general public. Originally, cook-offs were used as a duel of champions between opposing armies&amp;amp;mdash;said to have been conceived by the legendary general [[#L|Lushiku]]&amp;amp;mdash;in order to limit loss of life. Over the years, the format has emerged as a form of entertainment, with various gimmicks used, mostly designed for television. See [[nspost:39571344|here]] for more detail.&lt;br /&gt;
* &#039;&#039;&#039;Creyente&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Actually an [[Azertienne language|Azertienne]] word meaning &amp;quot;believer&amp;quot;, but commonly used for those who follow the [[Ipanism|Ipanist]] tradition. Synonymous with &#039;&#039;&amp;quot;disciple&amp;quot;&#039;&#039; (&amp;quot;follower&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;Cupressa&#039;&#039;&#039; &#039;&#039;(ˈkuː.prɛs.ɑː // COO·press·aa)&#039;&#039; &amp;amp;ndash; Site of a historic battle during the [[#W|War of the Metals]]. Located in the north-eastern part of [[Hearthlands, Osarius]], near the border with the [[Mount Crown region, Osarius|Mount Crown region]].&lt;br /&gt;
==D==&lt;br /&gt;
* &#039;&#039;&#039;Dandamali Tiẹbẹ&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally &amp;quot;platform of petition&amp;quot;. Refers to the elevated platform in the [[#O|Ogbokatoma]] (House of the Elders), infront of the [[Council of N&#039;Katoma]] and [[#S|Sarki]], under the [[#A|Akamami]] (Canopy of Wisdom). The place a designated speaker stands when addressing the congregation at an [[#N|Nzukọ Watilai]] (Meeting of Representatives).&lt;br /&gt;
* &#039;&#039;&#039;[[Djalia]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Also known as &amp;quot;the ancestral plane&amp;quot;, the Djalia is technically the part of the astral plane intersecting with both [[#T|Tiquoia]] and the material plane. While many will speak of it as the realm in which the ancestors dwell, this is not strictly true. The ancestors, like all dead, exist in Tiquoia, but traditional Cobre belief states that a representation of them exists in the Djalia, formed of the collective memory of the Cobre nation. When Cobrans speak of the ancestors visiting from the Djalia, to lend strength or wisdom, what they are really saying is &amp;quot;we must remember&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;[[Djeli]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A djeli is a storyteller, a keeper of history. They travel from settlement to settlement within Cobrio, performing with simple instruments to tell tales of the ancestors. Of particular note is that a djeli&#039;s knowledge is passed on through oral tradition only, with none of it written. This is to prevent [[#I|Ikpoa]] from corrupting the record. Some believe their instruments and words have a magical quality, allowing people who hear the djeli speak a tale to also &amp;quot;see&amp;quot; or even &amp;quot;feel&amp;quot; it (see [[#O|okun]]). History is a major part of Cobre culture, and as a result, the djeli&amp;amp;mdash;whose work is thought to keep the Djalia &amp;quot;alive&amp;quot;&amp;amp;mdash;are highly respected members of Cobre society.&lt;br /&gt;
* &#039;&#039;&#039;[[Doulea]]&#039;&#039;&#039; &#039;&#039;(ˈduː.leɪ // DOO·lay)&#039;&#039; &amp;amp;ndash; Site of a historic battle during the War of the Metals. Located in the central part of the [[Hearthlands (Osarian region)|Hearthlands]] region, west of [[Masaka, Osarius|Masaka]].&lt;br /&gt;
==E==&lt;br /&gt;
* &#039;&#039;&#039;Ebitu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A truncation of &amp;quot;ebi turari&amp;quot;, meaning &amp;quot;family spice&amp;quot;. The berries of the plant are said to taste like a combination of multiple staple spices in Cobre cuisine; hence the name. The berries are typically sun-dried before use, and may be ground before adding to sauces, stews etc. Whole dried berries are preferred for steeping, however. (OOC: It&#039;s [[wikipedia:allspice|allspice]], lol)&lt;br /&gt;
* &#039;&#039;&#039;Edenrin&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; See [[#A|Ahonelu]].&lt;br /&gt;
* &#039;&#039;&#039;Efiagya&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A particularly insulting term for a child of a man of low standing. Literally meaning &amp;quot;dirt father&#039;s blood&amp;quot;, it draws on the Akkano belief that [[#M|Mamula]]&amp;amp;mdash;goddess of the waters&amp;amp;mdash;is the originator of all humans&#039; blood (also referred to as Mamula&#039;s gift). To call someone &amp;quot;efiagya&amp;quot; is to imply that one&#039;s father has somehow tainted Mamula&#039;s gift. A related term, &amp;quot;ogyafi&amp;quot; (literally &amp;quot;mother&#039;s blood dirt&amp;quot;), is the most taboo swear word in Cobrio due to the blasphemous implication that Mamula&#039;s gift itself is dirty.&lt;br /&gt;
* &#039;&#039;&#039;[[Eluburu]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A popular form of dance-oriented music originating in Akach. The name comes from &amp;quot;elu&amp;quot; (lift, or elevate) and &amp;quot;aburu&amp;quot; (wretched). Lyrics typically recount the various social realities of Akachese people&amp;amp;mdash;particularly the youth&amp;amp;mdash;and are often written in a mixture of [[Cobre creole]] and [[Azertienne language|Azertienne]], incorporating a lot of street slang. Musically, Eluburu can be distinguished by its modern interpretations of traditional melodies and the characteristic &amp;quot;talking drums&amp;quot;&amp;amp;mdash;similar to the drums used by many djeli&amp;amp;mdash;which are used to create distinct seven stroke patterns known as the &amp;quot;bird&amp;quot; or &amp;quot;&#039;&#039;ijesanma&#039;&#039;&amp;quot; pattern&amp;amp;mdash;literally &amp;quot;walk&amp;quot; + &amp;quot;cloud&amp;quot;&amp;amp;mdash;usually in either a triple-pulse or duple-pulse structure. (OOC: it&#039;s basically Akachese [[wikipedia:Zouglou|zouglou]], and ijesanma is essentially [[wikipedia:Bemb%C3%A9_(rhythm)|bembé]])&lt;br /&gt;
* &#039;&#039;&#039;[[Eluvium]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A metallic element present in high quantities in Cobrio, since antiquity. It is thought to be extra-terrestrial in nature, due to its scarcity in nearby nations, and&amp;amp;mdash;to the knowledge of the Cobre people&amp;amp;mdash;complete absence elsewhere. The metal possesses several strange properties&amp;amp;mdash;many of which appear to require one to tap into [[#M|manu]]&amp;amp;mdash;and is used in many Cobre inventions as a result. Perhaps most notable is its ability to generate mass-altering fields when exposed to an electrical current. The name comes from the Cobre word &amp;quot;elu&amp;quot; meaning &amp;quot;above&amp;quot;, as both a reference to the metal&#039;s ability to make things easier to lift, and for its superior qualities in manufacturing.&lt;br /&gt;
* &#039;&#039;&#039;Emi&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A term loosely meaning &amp;quot;essence&amp;quot;, or &amp;quot;soul&amp;quot;. In [[Ipanism|Ipanist]] tradition, one&#039;s &#039;&#039;emi&#039;&#039; is contained in your navel. Traditional belief is that the &#039;&#039;emi&#039;&#039; is formed immediately after the confluence of your parents&#039; essences at conception, so it also takes a small part of the &#039;&#039;emi&#039;&#039; of each of your parents.&lt;br /&gt;
* &#039;&#039;&#039;Epajáni&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; From &#039;&#039;epa&#039;&#039; (&amp;quot;nut&amp;quot;) + &#039;&#039;jáni&#039;&#039; (&amp;quot;bite&amp;quot;). A traditional snack of roasted nuts and sugar. The heat melts the sugar into caramel, and the mixture is generally shaped into bite-sized balls before the caramel cools and sets. Frequently sold by street vendors. Far more common in Akach than Cobrio, but can be found more easily in the north-western parts of the latter.&lt;br /&gt;
* &#039;&#039;&#039;Eririnwa&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A large bow made of hardwood stained with the blood of a tiger. Associated most closely with the [[#N|Nguleri]] and [[#O|Ohafia people]]. The bows are said to be difficult to draw, and a Nguleri boy cannot be considered a man until he does so. Many women also use the Eririnwa proficiently, though it is not an expectation of them.&lt;br /&gt;
* &#039;&#039;&#039;Èṣe&#039;&#039;&#039; &#039;&#039;(ɛ̄.ʃé // eh-SHAY)&#039;&#039; &amp;amp;ndash; A truncation of &#039;&#039;Èṣeungan&#039;&#039; (&amp;quot;you are to be commended highly&amp;quot;), used as an informal way to give thanks.&lt;br /&gt;
&lt;br /&gt;
==F==&lt;br /&gt;
* &#039;&#039;&#039;Funpo&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; literally meaning &amp;quot;squeeze&amp;quot;. The term is often used in various contexts to refer to making things uncomfortable in some way. &lt;br /&gt;
==G==&lt;br /&gt;
==H==&lt;br /&gt;
* &#039;&#039;&#039;Habilitants&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; [[Azertienne language|Azertienne]] for &amp;quot;enablers&amp;quot;. The term applies collectively to all deities&amp;amp;mdash;variously referred to as  &amp;quot;éléments&amp;quot; (&amp;quot;elements&amp;quot;), &amp;quot;naturels&amp;quot; (&amp;quot;naturals&amp;quot;), or &amp;quot;donneurs&amp;quot; (&amp;quot;givers&amp;quot;)&amp;amp;mdash;honoured by &#039;&#039;[[#C|creyentes]]&#039;&#039;, or followers of the [[Ipanism|Ipanist]] tradition.&lt;br /&gt;
==I==&lt;br /&gt;
* &#039;&#039;&#039;Ibiori&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally &amp;quot;head place&amp;quot;, or &amp;quot;mind place&amp;quot;. A technique used by [[#D|djeli]] to augment memory capacity, enabling them to remember the vast amounts of information the profession requires. Similar to the [[wikipedia:Method_of_loci|Method of loci]] or &amp;quot;Mind Palaces&amp;quot;. Typically this is practiced from a very young age for maximum effect. Later developments would enable the use of [[#M|manu]]-charged pieces of [[#E|Eluvium]] to store memory, making it possible to transfer a meticulously built ibiori into a physical object.&lt;br /&gt;
* &#039;&#039;&#039;Ifuoké&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The &amp;quot;Rider of the Storm&amp;quot; in Cobre folklore. According to the folklore passed down by [[#D|djeli]] in the Ekezie lineage, they are said to be the messenger of the [[Irunashe]], travelling on the winds of a thunderstorm to deliver messages to deities and humans alike. The Rider of the Storm has no gender, though is often referred to as male.&lt;br /&gt;
* &#039;&#039;&#039;Ija tesiwaju&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A phrase famously used by [[Tukari Kaita]] when announcing [[Cobre Emancipation]], highlighting his belief that &amp;quot;the work [was] not yet done&amp;quot;. It is commonly used by Tukarists, meaning &amp;quot;the fight continues&amp;quot; or &amp;quot;the struggle continues&amp;quot;, in reference to the constant struggle to free the people from the oppressive yoke of the multiverse&#039;s capitalist-imperialist ruling class.&lt;br /&gt;
* &#039;&#039;&#039;Ijokodaraja&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally &amp;quot;Honour Seat&amp;quot;. The elevated seat separate from those of the [[Council of N&#039;Katoma]] under the [[#A|Akamami]], specifically reserved for the [[#S|Sarki]].&lt;br /&gt;
* &#039;&#039;&#039;Ikemi Sarki&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally translating to &amp;quot;force of the [[#S|Sarki]]&amp;quot;, the Ikemi (as they are most commonly referred to) are a sub-unit of the [[#Z|zabamince wadanda]] &amp;amp;ndash; usually comprised of new recruits undergoing final assessments, and veterans removed from high-pressure roles due to fading combat effectiveness. Their role is to act as general peacekeepers throughout Cobrio on behalf of the Sarki, and as such, are not beholden to any local authorities. Most often, though, the Ikemi are deployed as a deterrent to the general public, in areas where it is considered more likely that civil unrest may occur. Their training largely consists of de-escalation practices, and they are far less heavily armed for combat than the [[#Z|zabamince wadanda]]; instead carrying technology for crowd control, or incapacitation.&lt;br /&gt;
* &#039;&#039;&#039;Ikpoa&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The name given to the deity who personifies hatred among mankind. He is associated with blood red, and in traditional Cobre beliefs, seeks to destroy or corrupt progress made by mankind. It is important to note, however, that Ikpoa cannot corrupt a person. For this reason, [[#D|djeli]] persist with the oral tradition, as the words you hear cannot be tainted by Ikpoa&#039;s hatred of man. A written word, however, &amp;quot;cannot be trusted unless carved into the earth, which possesses the will of [[#O|Olugun]]&amp;quot;. Some have taken this phrase to mean that words carved into stone or metal are incorruptible. Traditional Cobre belief states that after Olugun created man, and favoured them, Ikpoa was driven mad with jealousy. His jealousy eventually became hatred, and he has sought to destroy mankind ever since but realises that only man can destroy man; and so he sabotages, sowing discord wherever possible.&lt;br /&gt;
* &#039;&#039;&#039;Ilutiorun&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally meaning &amp;quot;drum of heaven&amp;quot;, it is most commonly used as a poetic term to refer to thunder. In Cobre folklore, it is the sound made by a great drum being beaten, as commanded by [[#O|Olugun]] whenever he fought&amp;amp;mdash;and inevitably defeated&amp;amp;mdash;one of [[#I|Ikpoa]]&#039;s creations, sent to harm mankind. The term can also be applied to other, natural sounds of similar majesty heard at a distance, such as earthquakes, or volcanic eruptions.&lt;br /&gt;
* &#039;&#039;&#039;Imezi nzuzu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literal translation is difficult, but the general idea is &amp;quot;uneducated, uncultured people&amp;quot;. Sometimes translated as &amp;quot;stupid bush people&amp;quot; or &amp;quot;idiot farmers&amp;quot; (though the latter would not be used in Cobrio or Akach, where farmers are valued members of society).&lt;br /&gt;
* &#039;&#039;&#039;Inapaa&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; literally &amp;quot;turn off the light&amp;quot;. Can be used in various contexts which imply an inability to see, or a lack of consciousness. This can vary in degree from misdirection (as, for example, in the common use referring to a &amp;quot;dummy&amp;quot; or &amp;quot;feint&amp;quot; within association football) to literally rendering someone unconscious (the term is sometimes used in place of &amp;quot;knockout&amp;quot; in combat sports commentary). &lt;br /&gt;
* &#039;&#039;&#039;Ipa&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally meaning &amp;quot;force&amp;quot;, the term refers to a supernatural force permeating all facets of the universe. Legend has it that the term was coined by a battalion of [[#O|Ohafia]] warriors&amp;amp;mdash;evidence strongly suggests that various Cobre ethnicities intermixed in the west, making modern Akachese people descendants of the Cobre nation as a whole&amp;amp;ndash;defending the western coast of [[Rabastor]] just south of the [[Byrsic Delta]] (near modern-day [[Emekula]]). and allegedly began chanting &amp;quot;mare ipa abofun kobu nipawa&amp;quot; (&amp;quot;the almighty force protects the people through us&amp;quot;). This would repeat after victories by other battalions, of all descents among the [[Western Deltas|Akach]] people, and gradually become &amp;quot;mare ipa&amp;quot;, then &amp;quot;maripa&amp;quot;, and eventually just &amp;quot;ipa&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Ipalorun&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A term for the person who initiates a &#039;&#039;[[#C|creyente]]&#039;&#039; in the [[Ipanism|Ipanist]] tradition. It loosely translates to something like &amp;quot;godparent&amp;quot;, though sometimes a creyente may use &amp;quot;marraine&amp;quot; or &amp;quot;parrain&amp;quot;&amp;amp;mdash;&amp;quot;godmother&amp;quot; or &amp;quot;godfather&amp;quot; respectively&amp;amp;mdash;depending on gender identity. Ipalorun are often met with ritual prostration known as [[#O|obiteriba]] (&amp;quot;obey the parent&amp;quot;) upon entry to the &#039;&#039;chambre&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;[[Ipanism]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Also known as &amp;quot;La Loi de l&#039;Ipa&amp;quot;, &amp;quot;Sainteté&amp;quot;, or &amp;quot;The Law of the Great Sibling&amp;quot;. It is the national religion of [[Akach]], centred on the deity [[#I|Ipawolu]], with various unique terms, rituals and beliefs associated with it.&lt;br /&gt;
* &#039;&#039;&#039;[[Ipawolu]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Loosely translated as &amp;quot;Master of (the) Force&amp;quot;; &amp;quot;ipa&amp;quot; meaning &amp;quot;force&amp;quot;, and &amp;quot;olu&amp;quot; a combination of the prefixes &amp;quot;O&amp;quot; (meaning &amp;quot;great&amp;quot;) and &amp;quot;lu-&amp;quot; (meaning &amp;quot;absence&amp;quot; or &amp;quot;without&amp;quot;). Scholars believe that &amp;quot;olu&amp;quot; in this context refers to &amp;quot;the Great Void&amp;quot;, an unknowable location in time-space, beyond mortal comprehension. In such a place, one would be everywhere and nowhere all at once, and functionally omnipotent, as no limits can exist in such a place. Ipawolu is often closely identified with the Cobre deities [[Irunashe#Olugun|Olugun]] and [[Irunashe#Oluwu|Oluwu]], though many scholars believe Ipawolu refers to a different entity, in a different belief system altogether. Ipanist belief holds that all &#039;&#039;ipa&#039;&#039; originates with, and can only be tapped into, through Ipawolu. Notably, Ipawolu is typically not assigned a gender, instead referred to only by name, or in the abstract (e.g. &amp;quot;the one none can see&amp;quot;, or &amp;quot;the great sibling&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;Ipa&#039;elu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally meaning &amp;quot;force elevate&amp;quot; (&amp;quot;Ipa&amp;quot; = force; &amp;quot;elu&amp;quot; = elevate), but commonly taken to mean &amp;quot;Rise Up&amp;quot;. Often used as a rallying cry of encouragement. More common in Akach, where the phrase is used as the name of the [[Ipa&#039;elu System (Akach)|second tier football league]], though not uncommon in Cobrio.&lt;br /&gt;
* &#039;&#039;&#039;Ipetelai&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Meaning &amp;quot;eternal stew&amp;quot;, it was first created by the chef [[#O|Okwelle]] when travelling in the wilderness with the armies of [[#Lushiku|Lushiku]]. In the absence of a consistent source of meat or fish, Okwelle found a way to stretch the little he had available (mostly [[wikipedia:Game (hunting)|game]]) by retaining part of whatever he cooked on any given day and using it as the base for the following day. In doing so, the army did not notice when they were not receiving meat every day, due to the remnants of flavour. The technique became common among hunters, armies, merchants, and other travelling groups, as it allows one to leave the stew in the pot indefinitely, as long as it is reheated every few days and more [[#O|omilailai]] is added each time.&lt;br /&gt;
* &#039;&#039;&#039;[[Irunashe]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A term referring to the pantheon of spirits and deities worshipped and exalted throughout the Cobre nation. The number of Irunashe is disputed, as are their names. The only universally agreed points are that [[#O|Olugun]]&amp;amp;mdash;ruler of the sky, and father of knowledge and wisdom&amp;amp;mdash;is the Father of all Irunashe, and his wife, [[#M|Mamula]], rules over all waters and is the universal mother goddess.&lt;br /&gt;
* &#039;&#039;&#039;Irinaro&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Meaning &amp;quot;spear of steel&amp;quot;. The name given to the armoured train upon which [[Tukari Kaita]] toured Osarius during his campaign for Cobre Independence.&lt;br /&gt;
* &#039;&#039;&#039;Ishapa&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A perennial bush with deep red sepals, which are collected and dried for use in traditional Cobre cooking and medicine. They have a tart, dry flavour when steeped in water. (OOC: It&#039;s [[wikipedia:Roselle (plant)|Roselle]]; or Sorrel, if you&#039;re Jamaican)&lt;br /&gt;
* &#039;&#039;&#039;Iyin&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Imperative form of Atiyin (&amp;quot;to praise&amp;quot;), often used in a similar fashion to &amp;quot;give thanks to&amp;quot;. For example, the phrase &amp;quot;Mamiyin Okaita&amp;quot; compounds &amp;quot;[[#M|mame]]&amp;quot; (strengthen) with &amp;quot;iyin&amp;quot; (praise) as a sort of prayer for &amp;quot;Okaita&amp;quot; (&amp;quot;O&amp;quot; meaning great + Kaita, referring to [[Tukari Kaita]]), in thanks for his accomplishments in life, but also hope that [[Djalia|his spirit may live on]] and gain strength.&lt;br /&gt;
&lt;br /&gt;
==J==&lt;br /&gt;
* &#039;&#039;&#039;[[Jermain Marko]]&#039;&#039;&#039; &#039;&#039;(dʒɜːr.meɪn mɑːr.koʊ // jer·main MAA·k&#039;oh)&#039;&#039; &amp;amp;ndash; A former [[Kryosis|Kryosi]] operative turned Osarian intelligence agent. Played a part in thwarting two major plans by militants under [[Barrington Douglas]] which would have destabilised Osarius in the late 22nd century and early 23rd century. Rumour has it that he was also involved in the series of events that led to the rise of [[Tukari Kaita]] and the eventual secession of Cobrio from the Osarian Kingdom.&lt;br /&gt;
==K==&lt;br /&gt;
* &#039;&#039;&#039;[[Kalanigo people|Kalanigo]]&#039;&#039;&#039; &#039;&#039;(kæ.læ.ˈniː.goʊ // ka·la·NEE·go)&#039;&#039; &amp;amp;ndash; One of the ethnic groups, or &amp;quot;tribes&amp;quot; which make up the Cobre nation. Roughly translates to &amp;quot;people who devour&amp;quot;, in reference to the Kalanigo people&#039;s propensity to rapidly expand their territory.&lt;br /&gt;
* &#039;&#039;&#039;Kekezi&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The root of the verb &amp;quot;to read&amp;quot;. Notably an identical verb form in every known Cobre language. A common Cobre saying is &amp;quot;kekeno tani?&amp;quot; roughly translating to &amp;quot;have you read nothing today?&amp;quot;, which, depending on context, could be implying foolishness or laziness on the part of the recipient, or even simply remarking on their undertaking frivolous behaviour when something more productive could be done. Comparable to the [[wikipedia:Jamaican Patois|Jamaican Patois]] &amp;quot;yuh tek up book fram mawnin?&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Kensagha&#039;&#039;&#039; &#039;&#039;(kɛn.ˈsɑː.xæ // ken·SAA·ghah)&#039;&#039; &amp;amp;ndash; Loosely translated, it means &amp;quot;holy battle&amp;quot;, and refers to a set of ancient combat rules used in various exhibitions of martial skill within the Cobre nation. These contests hold great significance to their local communities and one found to break these rules would almost certainly face exile at the very least. The rules themselves vary a little from area to area, and among the different ethnic groups. When these contests take place between people of different ethnic groups, a compromised set of rules is agreed beforehand, known as &amp;quot;kensagha unu gon&amp;quot; (&amp;quot;united pact of holy battle&amp;quot;) to avoid any arguments after the result is determined. Kensagha was codified across all ethnic groups by a Council of Elders ([[#N|N&#039;Katoma]]) under the reign of [[Tukari Kaita]], to unify the Cobre nation as one. Some people and some places still prefer the old rules, however.&lt;br /&gt;
* &#039;&#039;&#039;Kiwani&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Lies, untruths. Though the word translated literally refers to deception, it can sometimes be used to refer to &amp;quot;empty words&amp;quot;, or speech considered otherwise meaningless. A Cobre person responding to something you say with &amp;quot;kiwani&amp;quot; may be responding in a similar manner to the idiomatic phrases &amp;quot;words are wind&amp;quot; or &amp;quot;talk is cheap&amp;quot; in English.&lt;br /&gt;
* &#039;&#039;&#039;Kobu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A shortened form of &amp;quot;Cobrio&amp;quot;, effectively meaning &amp;quot;the nation&amp;quot; or &amp;quot;the land&amp;quot;. See also: [[#C|Cobrio]].&lt;br /&gt;
* &#039;&#039;&#039;[[Kobufuniti]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Translates to &amp;quot;feed the nation&amp;quot;. The name given to a joint agricultural efficiency project between [[Odikolo Agricultural College]], [[Harambee Valley Agricole]], and the [[Umoja Universities Research Group]]. The project&#039;s aim was to find a sustainable method of mass producing food in a way that would allow the reduction of owo awonkobu, by ensuring that state-operated food banks would be able to adequately provide for all citizens instead. The project had a breakthrough development when attempting to cross-breed the [[#B|boolundu]] and [[#O|ounjegbo]] plants to produce a large food crop that could be grown in poor soil. The attempt failed, but in the process, the project uncovered a method of altering the speed at which plant matter decayed. By extension, this allowed them to develop crops specifically designed to compost faster, thus allowing farmers to improve the quality of poor soil more easily. &lt;br /&gt;
* &#039;&#039;&#039;[[Koromanti people|Koromanti]]&#039;&#039;&#039; &#039;&#039;(kɒr.ˈɒ.mæn.ˈtiː // kor·OH·man·TEE)&#039;&#039; &amp;amp;ndash; One of the ethnic groups, or &amp;quot;tribes&amp;quot; which make up the Cobre nation. The name derives from a term in an older Cobre language form, meaning &amp;quot;people with the power of the ocean&amp;quot;. It takes the &amp;quot;ko&amp;quot; form for &amp;quot;people&amp;quot; that was present in some descendant Cobre languages before unification under the banner of kobu rigo (See: [[#C|Cobrio]]).&lt;br /&gt;
* &#039;&#039;&#039;Kujichagulia Agreement&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The agreement which ratified the independence of the Cobre people, and the official formation of the Free State of Cobrio. &lt;br /&gt;
* &#039;&#039;&#039;Kwaaji&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; literally a &amp;quot;canvas&amp;quot;. Also used figuratively for any platform or stage for creating art, such as within association football, particularly when describing the principles of [[#A|Ákoleoso]].&lt;br /&gt;
* &#039;&#039;&#039;Kwane&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A creature from Cobre/[[Kholana people|Kholana]] folklore best described as a &amp;quot;lightning bird&amp;quot;. It is said to be able to summon storms and can drain the [[#M|manu]] (life force) of a person. Related is the concept of &amp;quot;thunder&amp;quot; (more commonly pronounced &amp;quot;tunda&amp;quot;) to represent anything that may bring great surprise to another, as a great shock is thought to temporarily cause a loss of life in metaphorical terms (much like the English colloquialism &amp;quot;you [nearly] gave me a heart attack&amp;quot;). So, then, the Cobre phrases &amp;quot;you bring kwane&amp;quot; or &amp;quot;you bring tunda&amp;quot; would be roughly analogous to &amp;quot;you have shocked/surprised me&amp;quot;. Similarly, &amp;quot;you kill my tunda&amp;quot; would be similar to &amp;quot;you have ruined the surprise&amp;quot;.&lt;br /&gt;
==L==&lt;br /&gt;
* &#039;&#039;&#039;Lukaba&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; a slang term for a system that does not reward merit. Derived from &amp;quot;[[#A|akaba]]&amp;quot; (meaning &amp;quot;ladder&amp;quot;) and the prefix &amp;quot;lu-&amp;quot; (meaning &amp;quot;without&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;Lushiku&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A [[#K|Koromanti]] general in antiquity, credited for the creation of the &amp;quot;Cobre [[#C|cook-off]]&amp;quot;&amp;amp;mdash;a culinary battle. Lushiku is renowned for his cunning, and preference to avoid combat where possible&amp;amp;mdash;something that made him popular among the smallfolk in particular.&lt;br /&gt;
==M==&lt;br /&gt;
* &#039;&#039;&#039;Mam&#039;manu&#039;&#039;&#039; &#039;&#039;(mæm.ˈmæ.noʊ // mam·MAH·noo)&#039;&#039; &amp;amp;ndash; Roughly translates to &amp;quot;strengthen life force&amp;quot;. A toast used to wish good health upon someone. Often used when drinking, much in the same way &amp;quot;Cheers!&amp;quot; is used in English. The phrase carries a deeper meaning, however, and is mostly used only in reference to the holder of a prestigious title such as [[#B|Babbanyawo Kadangare]]. If used for someone not holding a prestigious title, the implication is that one believes they should be. See also: [[#Manu&#039;nu|Manu&#039;nu]], a similar phrase.&lt;br /&gt;
* &#039;&#039;&#039;Mam&#039;unu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Roughly translates to &amp;quot;strengthen together&amp;quot; or &amp;quot;strength in numbers&amp;quot;. The name was adopted by a grassroots political movement that seeks to place power directly in the hands of the people. The movement&#039;s ideals are roughly analogous to those of [[wikipedia:Marxism|Marxist-communist]] groups in [[RLStates]]. In Cobre, such groups are labelled &amp;quot;[[#T|Tukarist]]&amp;quot;, after [[Tukari Kaita]], who first laid out the principles in his work &amp;quot;[[The Belly of the Beast (Tukari Kaita book)|The Belly of the Beast]]&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Mamezi&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The root of the verb &amp;quot;to strengthen&amp;quot;. Notably, this verb is shared across every known language that makes up the Cobre language family. The traditional greeting used when first addressing the [[#B|babbanyawo kadangare]] is &amp;quot;unukego mameze&amp;quot;, meaning &amp;quot;together we strengthen you&amp;quot;. A similar phrase is used when addressing an [[#N|Elder]]; &amp;quot;unukego mamekobu&amp;quot;, meaning &amp;quot;together we strengthen the nation&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Mamula&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The goddess of the waters, wife of [[#O|Olugun]], and mother of all creation. Mamula is said to possess &amp;quot;gentle persistence&amp;quot; like the river that erodes the earth, or the tide that erodes the cliffside. As water is necessary for life, Mamula is revered in Cobre tradition as it would not have been possible for Olugun to create man without her assistance. The Akkano people, in particular, revere Mamula as the originator of all [[#O|Ogya]].&lt;br /&gt;
* &#039;&#039;&#039;Manu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The word for one&#039;s life force, power, or energy. It is linked to the soul or spirit, and often believed to be &amp;quot;carried&amp;quot; in the blood -- which is why blood is important in traditional Cobre belief systems. Manu serves as the connection between the spiritual and the corporeal, and it is through manu that all interactions, ultimately, are possible. Manu is similar to the Polynesian concept of &amp;quot;[[wikipedia:Mana (Oceanian cultures)|mana]]&amp;quot;, though not quite the same, as places are not considered to possess manu, since they do not &amp;quot;live&amp;quot;, though they interact with the manu of living things. Manu also shares some characteristics with the Chinese concept of &amp;quot;[[wikipedia:qi|qi]]&amp;quot;, though they are distinct ideas. Similarly, some commonalities can be observed with the [[Xiaolin]] ideas of [[Breath (Xiaolin)|Breath]], and [[Pulse (Xiaolin)|Pulse]], which likely formed the basis of the concept in ancient times, when the Cobre people were believed to have had direct contact with the island of Xiaolin (which was then-located off the south-west coast of Cobrio). Notably, though, manu is a measurable phenomenon, via its interactions with the element [[#E|Eluvium]]. Cobre researchers are yet to discover why manu is more pronounced&amp;amp;mdash;according to reactions with eluvium&amp;amp;mdash;in Cobre people than others.&lt;br /&gt;
* &#039;&#039;&#039;Manu&#039;nu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Roughly translates to &amp;quot;life force unified&amp;quot;. Similar to mam&#039;manu, it is often used as a toast, like the English &amp;quot;Cheers!&amp;quot; and represents the underlying Cobre principle of unity (umoja). Manu&#039;nu is often used in more casual settings, as opposed to [[#M|mam&#039;manu]]&amp;amp;mdash;which is more spiritual in nature and thus used more sparingly.&lt;br /&gt;
* &#039;&#039;&#039;Menai&#039;&#039;&#039; &#039;&#039;(mɛn.ˈaɪ // men·EYE)&#039;&#039; &amp;amp;ndash; Site of a historic battle during the [[War of the Metals]]. Located in the southern part of the [[Hearthlands, Osarius|Hearthlands]] region, south of [[Junipa, Osarius|Junipa]], now falls under the co-operative region of [[Umoja (co-operative region)|Umoja]].&lt;br /&gt;
* &#039;&#039;&#039;Mlambo&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The Cobre word for river. It is often used to refer to any sacred water, however. It is believed in Cobre tradition that all rivers (and flowing waters) possess the spirit of [[#M|Mamula]], the goddess of water, and wife of [[#O|Olugun]].&lt;br /&gt;
* &#039;&#039;&#039;Mmirilan&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Short for &amp;quot;mmiri ara ehi lanari&amp;quot; (survival milk) is a traditional Cobre drink made from the seeds and pulp of the [[#B|Boolundu]] (&amp;quot;life ball&amp;quot;; breadfruit) plant. It naturally has a low alcohol content due to natural fermentation, but can be processed further to increase potency. A particularly potent version of the drink, known as &amp;quot;nuo&#039;kwe sere n&#039;elu&amp;quot; (the drink that lets you float above) is prepared by [[#D|djeli]], for ritual purposes. A similar drink &amp;amp;ndash; flavoured with &amp;quot;[[#I|ishapa]]&amp;quot; (hibiscus/roselle) and &amp;quot;[[#E|ebitu]]&amp;quot; (a truncation of &amp;quot;ebi turari&amp;quot;, or &amp;quot;family spice&amp;quot;; allspice)&amp;amp;mdash;known as &amp;quot;[[#M|mimu sopo]]&amp;quot; (connecting drink) is used by practitioners of [[#I|Ipanism]] during their rituals.&lt;br /&gt;
* &#039;&#039;&#039;[[Mpindami]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A [[#B|Biafrai]] general in antiquity, known for his harsh training methods and brutal efficiency in his youth. Nicknamed &amp;quot;ojiwasoke&amp;quot; (&amp;quot;the dark spike&amp;quot;), he was responsible for several devastating victories in battle which effectively wiped out certain peoples within the Cobre nation. Despite this, as he aged, Mpindami mellowed significantly, and grew to be an honourable man who was &amp;quot;like a father&amp;quot; to his men, and merciful toward his enemies. Famously, he was on the losing side in the first [[#C|Cobre cook-off]], when [[#O|Okwelle]], serving under [[#L|Lushiku]], served him a steamed, peppered perch.&lt;br /&gt;
* &#039;&#039;&#039;Mulu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Similar to boko, but more specifically refers to someone who is easily fooled. Calling someone &amp;quot;mulu&amp;quot; would be to imply they are easily taken in by &amp;quot;kiwani&amp;quot;. Can also be doubled to intensify; i.e. &amp;quot;mulu-mulu&amp;quot; is someone particularly easy to fool, as opposed to a regular &amp;quot;mulu&amp;quot;&lt;br /&gt;
==N==&lt;br /&gt;
* &#039;&#039;&#039;N&#039;Katoma&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally means &amp;quot;elder&amp;quot;, though this is not necessarily relating to age. An elder, in Cobre culture, is simply anybody who holds a position of prestige or authority. This applies to all facets of life, and so, it is not unheard of for a child to be considered the n&#039;katoma when speaking with a grandparent (for example) about modern technology. One cannot be considered to be n&#039;katoma without the express acknowledgement of others, though&amp;amp;mdash;in particular, those who you hold a position of prestige or authority over&amp;amp;mdash;and so the term carries great significance. A [[Council of N&#039;Katoma]]&amp;amp;mdash;elected by the various peoples of Cobrio&amp;amp;mdash;act as the nation&#039;s decision-makers and determine if and when it is necessary to appoint a [[#B|babbanyawo kadangare]]. They also act as a power-check on the [[#S|Sarki]], with the power to overrule the Sarki&#039;s decisions. If this is done three times, the Sarki is removed from the position as it is seen as a sign of [[Lufati (Cobre politics)|lufati]] (lit. &amp;quot;absence (of) trust/faith&amp;quot;; roughly equivalent to &amp;quot;a vote of no confidence&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;N&#039;kisi&#039;&#039;&#039; &#039;&#039;(nə.ˈkiː.sɪ // na·KEE·si)&#039;&#039; &amp;amp;ndash; Sometimes called N&#039;kishi (nə.ˈkiː.ʃɪ // na·KEE·shi). Traditional Cobre medicine. Typically involves the use of totems to invoke the power of ancestral spirits. In certain circles, this is the highest form of care one can give/receive. In others, it is considered to have no legitimate value besides a placebo effect at best. In such circles, N&#039;kisi is often disregarded as superstitious nonsense, or seen as a scam.&lt;br /&gt;
* &#039;&#039;&#039;N&#039;uju Aguba&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A large, curved blade carried only by full-fledged [[#O|Ohafia]] warriors. Its size warrants specialised training and great strength to wield, making it a sign of a warrior&#039;s proficiency. Largely ceremonial in modern times, they are carried primarily as status symbols; though some of the [[#Z|zabamince wadanda]] still carry one as a preferred weapon in their duties. The n&#039;uju aguba is a central part of the traditional Ohafia fighting style &amp;quot;[[agu chui]]&amp;quot; (&amp;quot;angry tiger&amp;quot;) along with the [[#E|eririnwa]].&lt;br /&gt;
* &#039;&#039;&#039;Ngugu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; An informal term for addressing an elder, which loosely translates to &amp;quot;old one&amp;quot;. It is often used in a mildly disrespectful manner similar to the English &amp;quot;gramps&amp;quot;, though it is not inherently disrespectful.&lt;br /&gt;
* &#039;&#039;&#039;[[Nguleri people|Nguleri]]&#039;&#039;&#039; &#039;&#039;(ˈguː.lɛ.riː // GOO·leh·ree)&#039;&#039; &amp;amp;ndash; One of the ethnic groups, or &amp;quot;tribes&amp;quot; which make up the Cobre nation. Derived from the old-Cobre &amp;quot;go leri&amp;quot;, meaning &amp;quot;people who glide (on the water)&amp;quot;, as the Nguleri were the first to travel inland over rivers.&lt;br /&gt;
* &#039;&#039;&#039;Nguso&#039;&#039;&#039; &#039;&#039;(ˈguː.soʊ // GOO·soh)&#039;&#039; &amp;amp;ndash; A practitioner of [[#N|N&#039;kisi]], often disparagingly referred to as a &amp;quot;witch doctor&amp;quot;. In truth, closer to the concept of a shaman. An honoured title in some places, but often ridiculed in large cities by those without superstitious beliefs. There are rituals one must go through to be recognised as a proper Nguso, though there is no official system by which this is certified.&lt;br /&gt;
* &#039;&#039;&#039;Njikoledo&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; literally &amp;quot;golden linking&amp;quot;. It refers to a [[wikipedia:Kintsugi|traditional method of repairing broken objects]], using the [[wikipedia:Urushiol|sap of certain trees]], mixed with powdered precious metals (usually gold). The result is that the flaw is now highlighted in a beautiful way, in line with the philosophy that breakage and repair is part of the history of an object (or person), rather than something to disguise.&lt;br /&gt;
* &#039;&#039;&#039;Nzukọ Watilai&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally &amp;quot;Meeting of Representatives&amp;quot;. Refers to any official gathering of the [[Council of N&#039;Katoma]] with the representatives of communities or organisations, at the [[#O|Ogbokatoma]].&lt;br /&gt;
==O==&lt;br /&gt;
* &#039;&#039;&#039;Obiteriba&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally &amp;quot;Obey the parent&amp;quot;. Refers to the ritual prostration performed by a &#039;&#039;[[#C|creyente]]&#039;&#039;, to their [[#I|Ipalorun]] upon entry into the &#039;&#039;chambre&#039;&#039;. Resembles the Japanese &#039;&#039;[[wikipedia:Dogeza|dogeza]]&#039;&#039;, though has a different cultural function.&lt;br /&gt;
* &#039;&#039;&#039;Ogbokatoma&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally &amp;quot;House of the Elder&amp;quot;. A semi-circular [[wikipedia:Roman_theatre_(structure)|theatre]] specifically used for meetings of the [[Council of N&#039;Katoma]]. The layout centres the Council&amp;amp;mdash;who sit under the [[#A|Akamami]], the sloped &amp;quot;Canopy of Wisdom&amp;quot;&amp;amp;mdash;in such a way that every other seat can view them directly. An elevated seat ([[#I|Ijokodaraja]]) behind the Council is reserved for the Sarki, and all of the Council&#039;s seats are backless, allowing them to turn and face the [[#S|Sarki]] easily. A platform ([[#D|Dandamali Tiẹbẹ]]) exists under the Akamami, in front of the Council, for a speaker to use when addressing either the Council (and Sarki), or the gathered representatives. Procedure dictates that only the Council, Sarki, or the person on the &#039;&#039;Dandamali Tiẹbẹ&#039;&#039; is permitted to address the congregation.&lt;br /&gt;
* &#039;&#039;&#039;Ogya&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The [[#A|Akkano]] term for &amp;quot;blood&amp;quot;, specifically referring to a mother&#039;s blood (as opposed to Agya; father&#039;s blood -- usually only used in the context of insults about one&#039;s parents, such as &amp;quot;efiagya&amp;quot;). The term ogya is mostly used in reference to inherited traits from one&#039;s mother, which are important in Akkano culture due to its matrilineality.&lt;br /&gt;
* &#039;&#039;&#039;[[Ogyaturu]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; An Akkano method of personality analysis, formed from the terms [[#O|Ogya]] and [[#T|Turu]]. &lt;br /&gt;
* &#039;&#039;&#039;[[Ohafia people|Ohafia]]&#039;&#039;&#039; &#039;&#039;(ˈoʊ.hæf.jæ // OH·haff·ya)&#039;&#039; &amp;amp;ndash; One of the ethnic groups, or &amp;quot;tribes&amp;quot; which make up the Cobre nation. Roughly translates to &amp;quot;people who fight&amp;quot;, ultimately deriving from the old-Cobre &amp;quot;kohafiya&amp;quot; (&amp;quot;ko&amp;quot; - &amp;quot;people&amp;quot;; &amp;quot;fiya&amp;quot; - &amp;quot;warrior&amp;quot;). Ohafia people are well known for being a &amp;quot;martial race&amp;quot;, and their warriors&#039; mastery of the [[#N|n&#039;uju aguba]]. The Ohafia once made up an elite military unit in the Osarian military, stationed in [[#C|Camaron]] and [[Inzon]], in what was then the Dynapolis region. Notable Ohafia people include boxing legends [[Olufemi Koné]] and [[Akachi Koné]].&lt;br /&gt;
* &#039;&#039;&#039;Okumiri&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Loosely translating to &amp;quot;fire water&amp;quot;, a distilled alcoholic beverage made from the starchy, root tubers of the [[#O|Ounjegbo]] (&amp;quot;nourishing root&amp;quot;) plant. To make it, the roots of the plant are peeled, and then steeped in water for three days. The steeping water is discarded, as it is toxic to humans, and the roots can then be grated and pressed to produce &amp;quot;[[#O|ounjomi]]&amp;quot; (ounjegbo water). Fermenting ounjomi will produce okumiri. Alternatively, the ounjomi can be boiled until it thickens into a dark syrup known as &amp;quot;[[#O|omilailai]]&amp;quot; (forever water), or &amp;quot;[[#O|oyinlai]]&amp;quot; (forever honey).&lt;br /&gt;
* &#039;&#039;&#039;Okwelle&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A master chef in antiquity, serving under [[#L|Lushiku]]. Specialising in seafood, renowned in Cobrio for never having lost a [[#C|cook-off]], and pioneering several culinary techniques and herb/spice combinations that persist in Cobre cuisine to the present day.&lt;br /&gt;
* &#039;&#039;&#039;Oluburu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A lesser deity in traditional Cobre religion, and the [[Ipanism|Ipanist]] tradition, governing fortune and luck. His name translates to &amp;quot;great one without misfortune&amp;quot;, and he is often invoked before, during, and after games of chance. &lt;br /&gt;
* &#039;&#039;&#039;Olugun&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The Father of the [[#I|Irunashe]]. Roughly equivalent to [[wikipedia:Odin|Odin]] in the [[wikipedia:Norse pantheon|Norse pantheon]]. Mostly associated with the domains of knowledge, wisdom and the sky. The earth itself is said to have been created from his unwavering will, only tempered by the gentle persistence of his wife, [[#M|Mamula]]. The closer the earth is to the sky &amp;amp;ndash; Olugun&#039;s realm &amp;amp;ndash; the stronger it is, and this is why mountains are immovable.&lt;br /&gt;
* &#039;&#039;&#039;Omilailai&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Translates to &amp;quot;forever water&amp;quot;; also known as &amp;quot;oyinlai&amp;quot; (forever honey). A dark syrup, made from [[#O|ounjomi]], which can be used as a base for stew, or applied to wounds as an antiseptic. Traditionally, omilailai is flavoured with spices like [[#E|ebitu]] and used as a base for many Cobre stews&amp;amp;mdash;most notably, [[#I|ipetelai]] (eternal stew)&lt;br /&gt;
* &#039;&#039;&#039;Ori buruku&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The literal translation is &amp;quot;mind broken&amp;quot;, but can be used in various situations to imply someone&#039;s way of thinking is undesirable. For example, someone who thinks farmers are inherently stupid may be told &amp;quot;ori buruku&amp;quot; by a Cobre person, since farmer is a highly respected profession in Cobre culture, since &amp;quot;without dey who grow food, none dey can eat&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Ounjegbo&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Meaning &amp;quot;nourishing root&amp;quot;, it is a perennial, woody shrub with a starchy root tuber that serves as a staple food in some areas of Cobrio due to its hardiness. As Ounjegbo is drought-tolerant, and can grow in poor quality soil, it is often grown as a failsafe plant. When eaten, it is typically boiled or roasted&amp;amp;mdash;after steeping it to remove naturally occurring toxic substances&amp;amp;mdash;but can also be mashed and dried to produce flour, or fermented into alcohol (usually in the form of [[#O|okumiri]]). Additionally, researchers have cultivated a genetically modified variant of the plant which maximises its efficiency as an ethanol biofuel feedstock; yielding upto 11% ethanol, compared to the theoretical maximum of around 5% for regular ounjegbo. (OOC: It&#039;s [[wikipedia:Cassava|Cassava]])&lt;br /&gt;
* &#039;&#039;&#039;Ounjibu&#039;&#039;&#039; &#039;&#039;(und͡ʒĩbu // OON-jib-oo)&#039;&#039; &amp;amp;ndash; Translated, can mean “super nourishment”. This is the name given to a group of selectively cross-bred crops, designed to fulfil one of two roles in Cobre agricultural tradition: either a food crop (for humans or livestock), or a crop grown specifically to add mass to a compost pile. These crops are divided into two subgroups accordingly: &#039;&#039;irinri&#039;&#039; (“to eat”) and &#039;&#039;dagbati&#039;&#039; (“to grow”), and the “parent seeds” are currently owned by [[Ipele Prossimo Humanité]] (IPH). The parent seeds are the result of generations of selective breeding per the Cobre agricultural tradition, combined with cross-breeding operations with technologically enhanced crops developed by the botanists and nutritional researchers within the [[Harambee Valley Agricole]] and the [[University of Dynapolis]]. &lt;br /&gt;
* &#039;&#039;&#039;Ounjomi&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The juice of the [[#O|Ounjegbo]] plant, after steeping. If prepared without steeping the roots beforehand, it is highly toxic, and at lower doses, has been known to cause dizziness, confusion, and loss of consciousness. At higher doses, paralysis, coma, seizures, and cardiac arrest have been observed. When fermented, ounjomi produces [[#O|okumiri]].&lt;br /&gt;
* &#039;&#039;&#039;Owo awonkobu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally translates to &amp;quot;people&#039;s money&amp;quot;. It is a form of [[wikipedia:Universal Basic Income|Universal Basic Income]] provided in [[Akach]], after a successful trial in [[Emekula, Akach|Emekula]]. A small amount of money is made available to every Akachese citizen eligible to vote, with subsidies of varying levels added for dependents. The success of the program in Akach has led to a campaign in Cobrio to enact a similar concept.&lt;br /&gt;
* &#039;&#039;&#039;Oya Ounje&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A large open-air food market in [[Camaron, Cobrio|Camaron]], spanning roughly sixteen thousand square yards. It grew organically in the former lands of an Osarian noble, seized by the separatist forces of [[#B|Barrington Douglas]] near the beginning of the struggle for independence. Over time, it grew, due to greater numbers of people flocking to the location to support the growing army based at the barracks in Camaron. The market these days is split into &amp;quot;sectors&amp;quot; for ease of navigation, with a dividing &amp;quot;street&amp;quot; through the centre, upon which several street food stalls are located. While there was no need for a permit originally to sell at the Oya Ounje, the [[Council of N&#039;Katoma]] have enforced permits in recent years by deploying some of the [[#I|Ikemi Sarki]] to maintain order. A rough translation of the name &amp;quot;Oya Ounje&amp;quot; is &amp;quot;nourishing market&amp;quot;, hinting at its content.&lt;br /&gt;
* &#039;&#039;&#039;Oyinlai&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; See [[#O|Omilailai]].&lt;br /&gt;
==P==&lt;br /&gt;
* &#039;&#039;&#039;Padapada&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; a slang term for a yo-yo. Comes from &amp;quot;pada&amp;quot;, meaning &amp;quot;return&amp;quot;, doubled up for emphasis. Also used in other contexts, such as within [[Àkoleoso]].&lt;br /&gt;
* &#039;&#039;&#039;Pontemundi&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; From the Latin &amp;quot;pontis&amp;quot; (bridge) and &amp;quot;mundus&amp;quot; (world); singular. &amp;quot;pontemundus&amp;quot;. The name given to the collection of virtual realms operated by the Cobre-Osarian-Akachese tech conglomerate [[Ipele Prossimo Humanité]] (IPH). Using advanced cerebral mapping techniques, in conjunction with [[#A|amami eziolu]], the architecture of pontemundi enable developers to create worlds that act as a bridge between reality as we know it, and the worlds that exist within a person&#039;s mind. Currently, these worlds require expensive equipment to use, but IPH have been acquiring companies with expertise in design and manufacture of the neuro-technical components required, with a view to mass-production.&lt;br /&gt;
==Q==&lt;br /&gt;
==R==&lt;br /&gt;
* &#039;&#039;&#039;[[Rabastorian Union]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The Rabastorian Union (RBU) is a politico-economic union of nations, located in various regions of the multiverse. The two largest and most powerful member states&amp;amp;mdash;[[Cobrio]] and [[Osarius]]&amp;amp;mdash;are located in [[Anaia]], specifically on a landmass commonly known to inhabitants as [[Rabastor]]. The RBU has developed an internal single market through trade agreements and a system of regulations that apply in all &amp;quot;full member&amp;quot; states, though there are different types of membership which confer different benefits and restrictions accordingly. RBU policies generally aim to remove restrictions on the movement of people, goods, services, and capital within the internal market, and maintain common policies on trade, agriculture, fisheries, and regional development while promoting co-operation between member states to maintain peace and order. Within the RBU, a valid passport issued by a member state is required to allow movement between states, while each individual member state issues its own permissions for external citizens to enter.&lt;br /&gt;
==S==&lt;br /&gt;
* &#039;&#039;&#039;Sarki&#039;&#039;&#039; &#039;&#039;(ˈsɑːr.kiː // SAA·key)&#039;&#039; &amp;amp;ndash; An old word meaning &amp;quot;King&amp;quot;, denotes a specific kind of honour when used. Almost spiritual in nature, as opposed to the political title of King.&lt;br /&gt;
* &#039;&#039;&#039;Shenju&#039;&#039;&#039; &#039;&#039;(ˈʃɛn.dʒuː // SHEN·joo)&#039;&#039; &amp;amp;ndash; An honorific title meaning &amp;quot;teacher&amp;quot;. Often used for elders or those considered wise. Its use is a sign of great respect for the person being referred to, and is not often used by students during their day-to-day studies. Rather, this title will be used specifically for a figure whose wisdom one respects greatly, or someone who is acknowledged to be above one&#039;s regular teacher.&lt;br /&gt;
==T==&lt;br /&gt;
* &#039;&#039;&#039;[[Temporal War]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A seventy year (roughly) war that occurred inside a time bubble, due to the machinations of the [[Kryosis|Kryosi Empire]]. [[Cobrio]] joined forces with [[Osarius]] to fend off the attacks, which was the start of a true alliance between the two nations, largely thanks to [[#T|Tukari Kaita]]. In the aftermath of the war, the [[#U|Umoja Accords]] were signed, cementing Cobrio&#039;s independence from Osarius, as well as establishing a co-operative relationship between the two nations.&lt;br /&gt;
* &#039;&#039;&#039;Tiquoia&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The ruler of the underworld (and the name of the underworld itself), where all dead souls go, to await the &amp;quot;recreation&amp;quot; ([[#U|Uturu]]) where all is balanced, and all lives exist in perfect harmony. Tiquoia is said to be strict, but never cruel.&lt;br /&gt;
* &#039;&#039;&#039;Tokolo&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A water spirit, often malevolent, but sometimes just mischievous. It is said that [[Tukari Kaita]] tamed the Tokolo to protect the coastline of Cobrio from attack during the struggle for independence and the [[Temporal War]] that followed, though it is unclear whether this actually happened.&lt;br /&gt;
* &#039;&#039;&#039;[[Tukari Kaita]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Highly esteemed Cobre leader, who served as both [[#S|Sarki]] and [[#B|Babbanyawo Kadangare]] at the time of Cobrio&#039;s independence. Led Cobre forces during the [[Temporal War]], and ultimately negotiated the [[#U|Umoja Accords]]. Credited with laying the groundwork for socially progressive movements&amp;amp;mdash;mainly focused on &amp;quot;returning power to the people&amp;quot; and the promotion of unity&amp;amp;mdash;in his writings (starting with &amp;quot;[[Belly of the Beast (Tukari Kaita book)|Belly of the Beast]]&amp;quot;; written about the Cobre movement&#039;s struggle for independence within Osarius). His ideas would be adopted by many in the decades to follow, and developed into a full-fledged political ideology and movement leading to the term &amp;quot;[[Tukarism]]&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;[[Tukarism]]&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A social and political ideology named for Cobre leader [[Tukari Kaita]], in which the people&#039;s self-determination is paramount. From his writings, it is clear that Kaita believed that co-operative economy, communal ownership of production, and protection of nature were key facets of &amp;quot;man&#039;s duty of life&amp;quot;. These concepts, together, form the basis of Tukarism, which seeks to replace traditional governance and economy with a co-operative system in which the community takes priority, sharing equally in the &amp;quot;bounties of the earth&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Turu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The [[#A|Akkano]] term for &amp;quot;house&amp;quot;, though it carries a more spiritual implication (perhaps more akin to &amp;quot;home&amp;quot;). Akkano people believe that all humans are born under a &amp;quot;turu&amp;quot; (like a [[wikipedia:Zodiac|zodiac sign]], I guess) which determines certain traits of the person on a spiritual level, and that these traits cannot be avoided or completely hidden.&lt;br /&gt;
==U==&lt;br /&gt;
* &#039;&#039;&#039;Ugwu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Literally meaning &amp;quot;north(ern)&amp;quot;. Often used by Cobre people to refer to Osarians, in a lightly disparaging manner. Can apply to any foreigner more generally, even if the nation is further south than Cobrio.&lt;br /&gt;
* &#039;&#039;&#039;Umoja&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Meaning &amp;quot;unity&amp;quot;, it is the co-operatively governed region that spans much of the border between Cobrio and Osarius. [[Tukari Kaita]] suggested its creation in opposition to the proposal of a &amp;quot;no man&#039;s land&amp;quot; or &amp;quot;neutral zone&amp;quot; between the two nations, citing his belief that those solutions would breed resentment, hostility, and distrust, eventually leading to a resumption of the war between the two nations. The capital of the region is [[Dynapolis, Cobrio|Dynapolis]], with a joint council meeting in The [[Kaita Chambers]] once a month to decide regional policy.&lt;br /&gt;
* &#039;&#039;&#039;Umoja Accords&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; The agreements signed by representatives of both [[Osarius]] and [[Cobrio]] at the end of the [[Temporal War]]. They ratified the independence of Cobrio from Osarius, the creation of the [[#U|co-operative region of Umoja]], and the establishment of a new [[Rabastorian Union]].&lt;br /&gt;
* &#039;&#039;&#039;Unugonke&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A pact, or promise, between two or more parties that is said to be upheld by the [[Irunashe]]. Legend has it that one who breaks the terms of Unugonke (literally &amp;quot;united pact life&amp;quot;) will die.&lt;br /&gt;
* &#039;&#039;&#039;[[Urawaga people|Urawaga]]&#039;&#039;&#039; &#039;&#039;(ˈuː.rɑː.wæ.gæ // OO·raa·wag·ah)&#039;&#039; &amp;amp;ndash; One of the ethnic groups, or &amp;quot;tribes&amp;quot; which make up the Cobre nation. Derived from the old-Cobre &amp;quot;yura wano go&amp;quot;, meaning &amp;quot;people who worship the sky&amp;quot;. This is a reference to the early Urawaga &amp;quot;superstition&amp;quot; of &amp;quot;reading the clouds&amp;quot; (See: [[#W|wanokeke]]) before making decisions.&lt;br /&gt;
* &#039;&#039;&#039;Utojáni&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; From &#039;&#039;uto&#039;&#039; (&amp;quot;sweet&amp;quot;) + &#039;&#039;jáni&#039;&#039; (&amp;quot;bite&amp;quot;). A traditional snack of fried, bite-sized dough balls. Generally made of dough containing flour, yeast, sugar, butter, salt, water and eggs (optional), and deep-fried in vegetable oil to a golden-brown colour. Baking powder is sometimes used as a replacement for yeast. After frying, the balls can be rolled in sugar, or another spice or flavouring such as cinnamon, vanilla or nutmeg. They are sometimes served with a dip, typically made from sweet fruit like strawberry or raspberry. (OOC: It&#039;s [[wikipedia:Puff-puff|puff-puff]]).&lt;br /&gt;
* &#039;&#039;&#039;Uturu&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Means &amp;quot;recreation&amp;quot;. The Cobre belief in a time when the [[Irunashe]] will converge, and re-create the world anew, erasing all problems. In the re-created world, there will be no suffering, as all will exist in perfect harmony, balanced with nature.&lt;br /&gt;
==V==&lt;br /&gt;
==W==&lt;br /&gt;
* &#039;&#039;&#039;Wanokeke&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Roughly translates to &amp;quot;sky reading&amp;quot;. Refers to the [[#U|Urawaga]] tradition of making decisions based on cloud formations (or lack thereof), and their shapes and colours. In modern times, this is considered &amp;quot;superstition&amp;quot; and treated much like astrology is. A related term, &amp;quot;wanori&amp;quot;, refers to the concept that all that will come is written in the sky. Comparable to the concept of &amp;quot;[[wikipedia:Moirai|fate]]&amp;quot; as seen in Greek mythology, for example.&lt;br /&gt;
* &#039;&#039;&#039;War of the Metals&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; A protracted series of battles between two noble house in [[Osarius]], which eventually led to the ascension of the [[#A|House of Aurumia]] to the throne. The losing family, the [[#A|House of Argento]], was based primarily in the Dynapolitan region and is believed to have previously subjugated the Cobre nation. The outcome of the war is said to have been a major factor in the dwindling population of Cobre peoples, and one of the reasons for the oppressive conditions under which they lived for decades.&lt;br /&gt;
* &#039;&#039;&#039;Wopomasi&#039;&#039;&#039; &#039;&#039;(IPA coming soon // WOH-poh-MASS-ee)&#039;&#039; &amp;amp;ndash; Literally meaning &amp;quot;common choice&amp;quot; or &amp;quot;common preference&amp;quot;, it is the traditional Cobre method of electing a [[#S|Sarki]]. Typically, the process requires each member of the [[Council of N&#039;Katoma]] to list their choices in order of preference, these preferences are then compared to determine which candidate is the &amp;quot;common preference&amp;quot; over most or all other options. A variation of this process which ranks the common preferences of all voters -- i.e. allows for selection of the &amp;quot;top &#039;&#039;n&#039;&#039;&amp;quot; preferences among voters -- is used to elect officials to local councils also.&lt;br /&gt;
==X==&lt;br /&gt;
==Y==&lt;br /&gt;
* &#039;&#039;&#039;Yoliso&#039;&#039;&#039; &#039;&#039;(IPA coming soon)&#039;&#039; &amp;amp;ndash; Third person future tense of yoliri (to win). Used mostly in chants, following a person, group, or entity. For example &amp;quot;Maripa Yoliso&amp;quot;, as used by fans of the [[Akach national football team]], to mean &amp;quot;The [[Ipanism|Almighty Force]] will win&amp;quot;; or &amp;quot;Unukobu Yoliso&amp;quot;, as used by Tukarists, which can be interpreted as &amp;quot;The People United will win&amp;quot; or &amp;quot;Together, the People will win&amp;quot;. Similar terms exist for the first person future tense conjugation singular (yolité) and plural (yoliṡé).&lt;br /&gt;
==Z==&lt;br /&gt;
* &#039;&#039;&#039;Zabamince wadanda&#039;&#039;&#039; &#039;&#039;(zæb.æ.ˈmɪn.tʃeɪ wæ.dæn.ˈdɑː // Zab·ah·MIN·chay wa·dan·DAH)&#039;&#039; &amp;amp;ndash; Loosely translated, it means &amp;quot;chosen trusted ones&amp;quot;. They serve as bodyguards and valets to the leader of the Cobre nation. To be appointed to the Zabamince wadanda is a great honour, and brings honour to your community and tribe. Generally speaking, the Zawa (as they are sometimes known) are made up of approximately equal numbers from each ethnic group, and both train with and guard the holder of the title [[#B|Babbanyawo Kadangare]]. However, in times where there is no recognised holder of this title, or at his/her command, they will guard other prominent figures within the Cobre nation. Since the death of [[#T|Tukari Kaita]], the Zawa have predominantly been assigned to guard the Sarki. A sub-unit of the Zawa ([[#I|Ikemi Sarki]]) was even formed expressly to serve the [[#S|Sarki]].&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Osarian_Football_Association&amp;diff=76965</id>
		<title>Osarian Football Association</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Osarian_Football_Association&amp;diff=76965"/>
		<updated>2026-10-13T09:08:35Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{short description|Governing body of association football in Osarius}}  {{about|the Football Association of Osarius|football associations in general|Football association|more detail on the sport|Association football}} {{National football association | Logo                     =  | Badge size               = 200 | Short name               = OFA | Founded                  = 2103 | Region                   = CAFA | Region affiliation       =  | President...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{short description|Governing body of association football in Osarius}} &lt;br /&gt;
{{about|the Football Association of Osarius|football associations in general|Football association|more detail on the sport|Association football}}&lt;br /&gt;
{{National football association&lt;br /&gt;
| Logo                     = &lt;br /&gt;
| Badge size               = 200&lt;br /&gt;
| Short name               = OFA&lt;br /&gt;
| Founded                  = 2103&lt;br /&gt;
| Region                   = [[CAFA]]&lt;br /&gt;
| Region affiliation       = &lt;br /&gt;
| President                = {{Pl|Axel|Rémy|t=f}}&lt;br /&gt;
| Headquarters             = [[Mount Crown Stadium]]&amp;lt;br /&amp;gt;Kenterbury Way&amp;lt;br /&amp;gt;Vallupin, Burningham&lt;br /&gt;
| National Stadium         = [[Mount Crown Stadium]]&lt;br /&gt;
}}&lt;br /&gt;
The &#039;&#039;&#039;Osarian Football Association&#039;&#039;&#039; (abbr. &#039;&#039;&#039;OFA&#039;&#039;&#039;) is the governing body of football in [[Osarius]] and is based in the capital, [[Mount Crown]]. It was formed in 2103, to formalise the organisation of [[wikipedia:association football|football]] in the nation, and oversee the fledgling [[OFA Golden League]] &amp;amp;ndash; the first professional football league in Osarius. In 2175, the OFA joined the [[World Cup Committee]] and began entering WCC-sanctioned events. &lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
===Background===&lt;br /&gt;
{{see also|History of the Osarius national football team}}&lt;br /&gt;
&lt;br /&gt;
==Activities==&lt;br /&gt;
The OFA sanctions all competitive football matches in Osarius, and notably operates a regional elite academy system, which selects and trains the brightest young talent in each of the seven regions of the country. These academies were designed to train the best players in Osarius in &amp;quot;[[Suzakudo|the Way of the Firebird]]&amp;quot;, with a view to instilling a &amp;quot;national style&amp;quot; which would carry through to the senior team and perpetuate success at international level. In modern times, this is less relevant, given the OFA&#039;s disinclination to enter WCC-sanctioned competition in recent decades.&lt;br /&gt;
&lt;br /&gt;
As the representative organisation for Osarian football within the Unified Rabastorian Football Federation (URFF), the OFA also determines and enforces rules governing Osarian national leagues, and movement between tiers for Osarian registered clubs within the URFF pyramid.&lt;br /&gt;
&lt;br /&gt;
==Competitions==&lt;br /&gt;
The OFA operates a number of competitions, including the following:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | [[OFA Cup]] || The association members&#039; cup. A knockout tournament open to all professional clubs in Osarius.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | [[Osarian Football League]] || [[OFA Phoenix League]] || The highest national level of professional football in Osarius. Feeds into the [[Rabastor Challenge League]].&lt;br /&gt;
|-&lt;br /&gt;
| [[OFA Regional Leagues]] || The second and third national tiers of professional football in Osarius&amp;lt;br /&amp;gt;Split into Northern, Western, and Eastern divisions&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | [[OFA League Trophy]] || A knockout tournament open to teams in OFA Regional Leagues.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | [[OFA Members&#039; Plate]] || A knockout tournament open to OFA-registered teams outside the URFF pyramid.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | [[OFA King&#039;s Shield]] || An annual &amp;quot;super cup&amp;quot; contested by two invited Osarian clubs.&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;Typically, this is the winners of the most prestigious cup among all Osarian cup winners (including the [[Rabastor Champions&#039; Cup]] and [[Rabastor League Trophy]]), and the most recent national champions (which includes teams competing in the [[Rabastor Football League]] and [[Rabastor Challenge League]]).&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | [[OFA Rising Trophy]] || A two-tiered youth league formed to give players at regional elite academies some competitive experience. Open to elite academies only.&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | [[OFA Youth Cup]] || A knockout tournament open to all under-19 teams in Osarius. A youth counterpart to the OFA Cup.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Honours==&lt;br /&gt;
&lt;br /&gt;
{{Football in Osarius}}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Futbol_Association_of_the_Dominion_of_Aquillian&amp;diff=76963</id>
		<title>Futbol Association of the Dominion of Aquillian</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Futbol_Association_of_the_Dominion_of_Aquillian&amp;diff=76963"/>
		<updated>2026-10-12T09:31:18Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Asociación de Fútbol Aquilliano&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Asociación de Fútbol Aquilliano]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Eristicean_Football_Council&amp;diff=76962</id>
		<title>Eristicean Football Council</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Eristicean_Football_Council&amp;diff=76962"/>
		<updated>2026-10-12T09:31:17Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Eristicean Football Syndicate&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Eristicean Football Syndicate]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Marmaladaica_Friendship_Council_for_Football&amp;diff=76961</id>
		<title>Marmaladaica Friendship Council for Football</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Marmaladaica_Friendship_Council_for_Football&amp;diff=76961"/>
		<updated>2026-10-12T09:31:15Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Marmaladaican Soccer Friendship Council&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Marmaladaican Soccer Friendship Council]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Callistean_Sports_Council&amp;diff=76960</id>
		<title>Callistean Sports Council</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Callistean_Sports_Council&amp;diff=76960"/>
		<updated>2026-10-12T09:31:13Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Grand Royal Association of Cytherean Episkyros&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Grand Royal Association of Cytherean Episkyros]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Football_Association_of_Kryosis&amp;diff=76959</id>
		<title>Football Association of Kryosis</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Football_Association_of_Kryosis&amp;diff=76959"/>
		<updated>2026-10-12T09:31:12Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Revolutionary Imperial Soccer Enterprise&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Revolutionary Imperial Soccer Enterprise]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Kryosi_Bureau_of_Football&amp;diff=76958</id>
		<title>Kryosi Bureau of Football</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Kryosi_Bureau_of_Football&amp;diff=76958"/>
		<updated>2026-10-12T09:31:10Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Revolutionary Imperial Soccer Enterprise&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Revolutionary Imperial Soccer Enterprise]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Fba/list&amp;diff=76955</id>
		<title>Template:Fba/list</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Fba/list&amp;diff=76955"/>
		<updated>2026-10-12T09:28:55Z</updated>

		<summary type="html">&lt;p&gt;Osarius: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#switch: {{{1}}}&lt;br /&gt;
&amp;lt;!--add your nation and their football association names here--&amp;gt;&lt;br /&gt;
 | 95X = 95X Football Association&lt;br /&gt;
 | Abaja = Abaja Football Association&lt;br /&gt;
 | Abanhfleft = Abanhfleft Football Association&lt;br /&gt;
 | Akach = Federation Akachese de Football&lt;br /&gt;
 | Aleirave = Aleirave Football Association&lt;br /&gt;
 | Ancharmunn = Ancharmunn Football Association&lt;br /&gt;
 | Ancherion = Ancherion Football Association&lt;br /&gt;
 | Anjung Batu = Anjung Batu Football Association&lt;br /&gt;
 | Apox = Apox Football Association&lt;br /&gt;
 | Appalachian Nation = Appalachian Nation Football Association&lt;br /&gt;
 | Aquillian = Asociación de Fútbol Aquilliano&lt;br /&gt;
 | Association francophone = Association francophone Football Association&lt;br /&gt;
 | Astograth = Futbol Astograthiko Federazioa&lt;br /&gt;
 | Atheara = Atheara Football Association&lt;br /&gt;
 | Audioslavia = Audioslavia Football Association&lt;br /&gt;
 | Aut-Ves-Nat = Aut-Ves-Nat Football Association&lt;br /&gt;
 | Baker Park = Baker Park Football Association&lt;br /&gt;
 | Banija = Banija Football Association&lt;br /&gt;
 | Baranil = Baranil Football Association&lt;br /&gt;
 | Beepee = Beepee Football Association&lt;br /&gt;
 | Blaneu = Blaneu Football Association&lt;br /&gt;
 | Bolgano = Bolgano Football Association&lt;br /&gt;
 | Boring Paradise = Boring Paradise Football Association&lt;br /&gt;
 | Brenecia = Brenecia Football Association&lt;br /&gt;
 | Callistea = Grand Royal Association of Cytherean Episkyros&lt;br /&gt;
 | Capitalizt SLANI = Capitalizt SLANI Football Association&lt;br /&gt;
 | Chinese Congo = Chinese Congo Football Association&lt;br /&gt;
 | Chromatika = Chromatika Football Association&lt;br /&gt;
 | Cobrio = Cobre Football Federation&lt;br /&gt;
 | Coldfield = Coldfield Football Association&lt;br /&gt;
 | Cosneolta = Cosneolta Football Association&lt;br /&gt;
 | Cosumar = Cosumar Football Association&lt;br /&gt;
 | Crystal Empire = Crystal Empire Football Association&lt;br /&gt;
 | Côte d&#039;Saphir = Côte d&#039;Saphir Football Association&lt;br /&gt;
 | Damukuni = Damukuni Football Association&lt;br /&gt;
 | Darmen = Darmen Football Association&lt;br /&gt;
 | Delaclava = Delaclava Football Association&lt;br /&gt;
 | Demanams = Demanams Football Association&lt;br /&gt;
 | Diwedd Ardal = Goruchel Gymdeithas Bêl-droed Ardaly&lt;br /&gt;
 | Donnaconna = Donnaconna Football Association&lt;br /&gt;
 | Dreamplanet = Dreamplanet Football Association&lt;br /&gt;
 | Eastfield Lodge = Eastfield Lodge Football Association&lt;br /&gt;
 | Eileanan Sgothach = Eileanan Sgothach Football Association&lt;br /&gt;
 | Equestria = Equestrian Football Association&lt;br /&gt;
 | Equestria Magna = Equestria Magna Football Association&lt;br /&gt;
 | Eraman = Eraman Football Association&lt;br /&gt;
 | Erdingham = Erdingham National Football Board&lt;br /&gt;
 | Eristicea = Eristicean Football Syndicate&lt;br /&gt;
 | Esportivan Darmen = Esportivan Darmen Football Association&lt;br /&gt;
 | Estorvipa and Estorpiva = Football Association of Estorvipa and Estorpiva&lt;br /&gt;
 | Eternal September = Eternal September Football Association&lt;br /&gt;
 | Ethane = Ethane Football Association&lt;br /&gt;
 | Eura = Eura Football Association&lt;br /&gt;
 | Euran Oceania Territories = Euran Oceania Territories Football Association&lt;br /&gt;
 | Farfadillis = Farfadillis Football Association&lt;br /&gt;
 | Filindostan = Filindostan Football Association&lt;br /&gt;
 | Flavovespia = Flavovespia Football Association&lt;br /&gt;
 | Flekkefjord = Flekkefjord Football Association&lt;br /&gt;
 | Freeport = Freeport Football Association&lt;br /&gt;
 | Fujai = Fujai Football Association&lt;br /&gt;
 | Garifunya = Garifunya Football Association&lt;br /&gt;
 | Gergary = Gergary Football Association&lt;br /&gt;
 | Ginadjkrum = Ginadjkrum Football Association&lt;br /&gt;
 | Glazgo = Glazgo Football Association&lt;br /&gt;
 | Greythrone = Greythrone Football Association&lt;br /&gt;
 | Græntfjall = Græntfjall Football Association&lt;br /&gt;
 | HUElavia = HUElavia Football Association&lt;br /&gt;
 | Havynwilde = Havynwilde Football Association&lt;br /&gt;
 | Huayramarca = Football Federation of Huayramarca&lt;br /&gt;
 | Imagineria = Imagineria Football Association&lt;br /&gt;
 | Indusse = Indusse Football Association&lt;br /&gt;
 | Iskandervale = Iskandervale Football Association&lt;br /&gt;
 | Jasiyun = Jasiyun Football Association&lt;br /&gt;
 | Jeckland = Jeckland Football Association&lt;br /&gt;
 | Juvencus = Juvencus Football Association&lt;br /&gt;
 | Kage no Ryouiki = Abyssal Council of Yokai Football&lt;br /&gt;
 | Kayangan = Kayangan Football Association&lt;br /&gt;
 | Kelssek = Kelssek Football Association&lt;br /&gt;
 | Kencana = Kencana Football Association&lt;br /&gt;
 | Kernovi = Kernovi Football Association&lt;br /&gt;
 | Khantari = Khantari Football Association&lt;br /&gt;
 | Kita-Hinode = Kita-Hinode Football Association&lt;br /&gt;
 | Ko-oren = Ko-oren Football Association&lt;br /&gt;
 | Koana Islands = Koana Islands Football Association&lt;br /&gt;
 | Kohnhead = Kohnhead Football Association&lt;br /&gt;
 | Krytenia = Krytenia Football Association&lt;br /&gt;
 | Kryosis = Kryosi Institute for Competitive Kickball&lt;br /&gt;
 | Legalese = Legalese Football Association&lt;br /&gt;
 | Lerujka = Lerujka Football Association&lt;br /&gt;
 | Limey George = Limey Association Football Federation&lt;br /&gt;
 | Lisander = Lisander Football Association&lt;br /&gt;
 | Lovisa = Lovisa Football Association&lt;br /&gt;
 | Mareibat = Mareibat Football Association&lt;br /&gt;
 | Marmaladaica = Marmaladaican Soccer Friendship Council&lt;br /&gt;
 | Maryloupe = Maryloupe Football Association&lt;br /&gt;
 | Mavinet = Mavinet Football Association&lt;br /&gt;
 | Melayu Archipelago = Melayu Archipelago Football Association&lt;br /&gt;
 | Mercedini = Mercedini Football Association&lt;br /&gt;
 | Mertagne = Federation of Mertagnian Football&lt;br /&gt;
 | Mitra and Soma = Mitra and Soma Football Association&lt;br /&gt;
 | Mkabia = Mkabia Football Association&lt;br /&gt;
 | Mont Vert = Mont Vert Football Association&lt;br /&gt;
 | Mriin = Mriin Football Association&lt;br /&gt;
 | Murderbum = Murderbum Football Association&lt;br /&gt;
 | Mytanija = Mytanija Football Association&lt;br /&gt;
 | Nephara = Nephara Football Association&lt;br /&gt;
 | New Lusitania = New Lusitania Football Association&lt;br /&gt;
 | New Lusitanian Ultramar = New Lusitanian Ultramar Football Association&lt;br /&gt;
 | North New South Wales = North New South Wales Football Association&lt;br /&gt;
 | North Quadana = North Quadana Football Association&lt;br /&gt;
 | Northwest Kalactin = Northwest Kalactin Football Association&lt;br /&gt;
 | Nova Anglicana = Nova Anglicana Football Association&lt;br /&gt;
 | Novum-castrum = Curia Harpasti et Pediludii Imperii&lt;br /&gt;
 | Oberour Ar Moro = Oberour Ar Moro Football Association&lt;br /&gt;
 | Ochre Islands = Ochre Islands Football Association&lt;br /&gt;
 | Olastor = Olastor Football Association&lt;br /&gt;
 | Omerica = United Republican Soccer Federation&lt;br /&gt;
 | Osarius = Osarian Football Association&lt;br /&gt;
 | Pasarga = Pasarga Football Association&lt;br /&gt;
 | Pauh Janggi = Pauh Janggi Football Association&lt;br /&gt;
 | Pemecutan = Pemecutan Football Association&lt;br /&gt;
 | Plane of Possibility = Plane of Possibility Football Association&lt;br /&gt;
 | Poafmersia = Poafmersia Football Association&lt;br /&gt;
 | Poafmersia = Poafmersia Football Association&lt;br /&gt;
 | Polkopia = Polkopia Football Association&lt;br /&gt;
 | Prahecq = Prahecq Football Association&lt;br /&gt;
 | Pridnestrovia = Pridnestrovia Football Association&lt;br /&gt;
 | Pripet Socialist Republic = Pripet Socialist Republic Football Association&lt;br /&gt;
 | Pyazhnaya = Pyzhnayan Football Federation&lt;br /&gt;
 | Quebec and Shingoryeo = Royal Quebecois Football Association&lt;br /&gt;
 | Qusmo = Qusmo Football Association&lt;br /&gt;
 | Ravenweather = Ravenweather Football Association&lt;br /&gt;
 | Recuecn = Recuecn Football Association&lt;br /&gt;
 | Robostania = Robostania Football Association&lt;br /&gt;
 | Royal Kingdom of Quebec = Royal Kingdom of Quebec Football Association&lt;br /&gt;
 | Sajnur = Sajnur Football Association&lt;br /&gt;
 | Saltstead = Royal Saltsteadish Football Association&lt;br /&gt;
 | San Felix = San Felix Football Association&lt;br /&gt;
 | Sankt Konrad = Sankt Konrad Football Association&lt;br /&gt;
 | Savigliane = Savigliane Football Association&lt;br /&gt;
 | Savojarna = Savojarna Football Association&lt;br /&gt;
 | Schottia = Schottia Football Association&lt;br /&gt;
 | Semarland = Semarland Football Association&lt;br /&gt;
 | Seraxinbourgh = Seraxinbourgh Football Association&lt;br /&gt;
 | Sharktail = Sharktail Football Association&lt;br /&gt;
 | Sienna Archipelago = Sienna Archipelago Football Association&lt;br /&gt;
 | Siovanija and Teusland = Siovanija and Teusland Football Association&lt;br /&gt;
 | Soracana Islands = Soracana Islands Football Association&lt;br /&gt;
 | Soute = Soute Football Association&lt;br /&gt;
 | South Newlandia = South Newlandia Football Association&lt;br /&gt;
 | Southern Palm Islands = Southern Palm Islands Football Association&lt;br /&gt;
 | Space Laser Dinosaur Robot Pirate Land = Space Laser Dinosaur Robot Pirate Land Football Association&lt;br /&gt;
 | Springmont = Springmont Football Association&lt;br /&gt;
 | Squidroidia = Squidroidia Football Association&lt;br /&gt;
 | Squornshelan Remnant States = Squornshelan Remnant States Football Association&lt;br /&gt;
 | Starblaydia = Starblaydia Football Association&lt;br /&gt;
 | Starcom Racing = Starcom Racing Football Association&lt;br /&gt;
 | Steelbaron = Steelbaron Football Association&lt;br /&gt;
 | StrayaRoos = StrayaRoos Football Federation&lt;br /&gt;
 | Sylestone = Sylestone Football Association&lt;br /&gt;
 | Taeshan = Taeshan Football Association&lt;br /&gt;
 | Talamia = Talamia Football Association&lt;br /&gt;
 | Tamgu = Tamgu Football Association&lt;br /&gt;
 | Tequilo = Tequilo Football Association&lt;br /&gt;
 | Terre Septentrionale = Terre Septentrionale Football Association&lt;br /&gt;
 | The Cross Islands = The Cross Islands Football Association&lt;br /&gt;
 | The Golden Lotus = The Golden Lotus Football Association&lt;br /&gt;
 | The Gothanita Isles = Gothanita Isles Football Confederation&lt;br /&gt;
 | The Grearish Union = Grearish Football Association&lt;br /&gt;
 | The Jovannic = The Jovannic Football Association&lt;br /&gt;
 | The Karodin Tetrarchy = The Karodin Tetrarchy Football Association&lt;br /&gt;
 | The Quagpire = The Quagpire Football Association&lt;br /&gt;
 | The Sarian = The Sarian Football Association&lt;br /&gt;
 | Timuria = Timuria Football Association&lt;br /&gt;
 | Tinhampton = Tinhampton Football Association&lt;br /&gt;
 | Tobar Gainimh = Ard-Chumann Caide den Ghaineamh&lt;br /&gt;
 | Tobiasia = Tobiasia Football Association&lt;br /&gt;
 | Torisakia = Torisakia Football Association&lt;br /&gt;
 | Tumbra = Tumbran Football Federation&lt;br /&gt;
 | Turori = Turori Football Association&lt;br /&gt;
 | Unified Legandia = Unified Legandia Football Association&lt;br /&gt;
 | Union of Socialist Alpine Republics = Union of Socialist Alpine Republics Football Association&lt;br /&gt;
 | Valanora = Valanora Football Association&lt;br /&gt;
 | Valladares = Valladar Football Association&lt;br /&gt;
 | Velestria = Velestria Football Association&lt;br /&gt;
 | Vilita = Vilita Football Association&lt;br /&gt;
 | Wara-Salas = Wara-Salas Football Association&lt;br /&gt;
 | Whirl Islands = Whirl Islands Football Association&lt;br /&gt;
 | Xanneria = Xanneria Football Association&lt;br /&gt;
 | Xiaolin = Xiaolin Football Council&lt;br /&gt;
 | Yesopalitha = Yesopalitha Football Association&lt;br /&gt;
 | Yguazú = Yguazú Football Association&lt;br /&gt;
 | Yuezhou = Yuezhou Football Association&lt;br /&gt;
 | Zeniyadh = Zeniyadh Football Association&lt;br /&gt;
 | Zeta Reka &amp;amp; Hügeltaldom = Zeta Reka &amp;amp; Hügeltaldom Football Association&lt;br /&gt;
 | Ziwana = Ziwana Football Association&lt;br /&gt;
 | Zwangzug = Zwangzug Football Association&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--for any old variations of your country&#039;s football associations--&amp;gt;&lt;br /&gt;
 | Omerica_old = Omerican Football Federation&lt;br /&gt;
 | The Gothanita Isles_old = Gothanitan Football Federation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--add your nation&#039;s code below--&amp;gt;&lt;br /&gt;
 | 95X_c = NFX&lt;br /&gt;
 | Abaja_c = ABJ&lt;br /&gt;
 | Abanhfleft_c = AFT&lt;br /&gt;
 | Akach_c = AKC&lt;br /&gt;
 | Ancharmunn_c = ANC&lt;br /&gt;
 | Ancherion_c = ACH&lt;br /&gt;
 | Anjung Batu_c = AUU&lt;br /&gt;
 | Apox_c = APX&lt;br /&gt;
 | Appalachian Nation_c = APY&lt;br /&gt;
 | Aquillian_c = AQL&lt;br /&gt;
 | Association francophone_c = ACF&lt;br /&gt;
 | Astograth_c = ASG&lt;br /&gt;
 | Audioslavia_c = AUD&lt;br /&gt;
 | Aut-Ves-Nat_c = AVN&lt;br /&gt;
 | Baker Park_c = CBP&lt;br /&gt;
 | Banija_c = BNJ&lt;br /&gt;
 | Baranil_c = BRN&lt;br /&gt;
 | Beepee_c = BPE&lt;br /&gt;
 | Blaneu_c = BLA&lt;br /&gt;
 | Bolgano_c = BGN&lt;br /&gt;
 | Boring Paradise_c = BRP&lt;br /&gt;
 | Brenecia_c = BRE&lt;br /&gt;
 | Callistea_c = CLS&lt;br /&gt;
 | Capitalizt SLANI_c = COM&lt;br /&gt;
 | Chartistan_c = CHA&lt;br /&gt;
 | Chinese Congo_c = CCG&lt;br /&gt;
 | Choudal_c = CHD&lt;br /&gt;
 | Chromatika_c = CMT&lt;br /&gt;
 | Cobrio_c = CBR&lt;br /&gt;
 | Coldfield_c = COL&lt;br /&gt;
 | Cosneolta_c = CSN&lt;br /&gt;
 | Cosumar_c = COS&lt;br /&gt;
 | Côte d&#039;Saphir_c = CSA&lt;br /&gt;
 | Crystal Empire_c = CRY&lt;br /&gt;
 | Damukuni_c = DKI&lt;br /&gt;
 | Darmen_c = DAR&lt;br /&gt;
 | Delaclava_c = DEL&lt;br /&gt;
 | Demanams_c = DNS&lt;br /&gt;
 | Diwedd Ardal_c = DWA&lt;br /&gt;
 | Donnaconna_c = DCA&lt;br /&gt;
 | Dreamplanet_c = DRP&lt;br /&gt;
 | Eastfield Lodge_c = EFL&lt;br /&gt;
 | Eileanan Sgothach_c = EIL&lt;br /&gt;
 | Equestria Magna_c = EQM&lt;br /&gt;
 | Equestria_c = EQS&lt;br /&gt;
 | Eraman_c = ERM&lt;br /&gt;
 | Erdingham_c = ERD&lt;br /&gt;
 | Eristicea_c = ERS&lt;br /&gt;
 | Eternal September_c = ETS&lt;br /&gt;
 | Ethane_c = ETN&lt;br /&gt;
 | Eura_c = EUR&lt;br /&gt;
 | Euran Oceania Territories_c = EOT&lt;br /&gt;
 | Farfadillis_c = FFD&lt;br /&gt;
 | Filindostan_c = FID&lt;br /&gt;
 | Flavovespia_c = FVA&lt;br /&gt;
 | Flekkefjord_c = FKD&lt;br /&gt;
 | Freeport_c = FPT&lt;br /&gt;
 | Fujai_c = FJA&lt;br /&gt;
 | Garifunya_c = GAR&lt;br /&gt;
 | Gergary_c = GGY&lt;br /&gt;
 | Glazgo_c = GLZ&lt;br /&gt;
 | Græntfjall_c = GRF&lt;br /&gt;
 | Greythrone_c = GYT&lt;br /&gt;
 | Havynwilde_c = HVY&lt;br /&gt;
 | HUElavia_c = HUE&lt;br /&gt;
 | Imagineria_c = IGN&lt;br /&gt;
 | Indusse_c = INS&lt;br /&gt;
 | Jasiyun_c = JSY&lt;br /&gt;
 | Jeckland_c = JEC&lt;br /&gt;
 | Juvencus_c = JUE&lt;br /&gt;
 | Kage no Ryouiki_c = KNR&lt;br /&gt;
 | Kayangan_c = KGN&lt;br /&gt;
 | Kelssek_c = KSK&lt;br /&gt;
 | Kencana_c = KNC&lt;br /&gt;
 | Kernovi_c = KRV&lt;br /&gt;
 | Khantari_c = HTR&lt;br /&gt;
 | Kita-Hinode_c = HIN&lt;br /&gt;
 | Ko-oren_c = KOR&lt;br /&gt;
 | Koana Islands_c = KOA&lt;br /&gt;
 | Kohnhead_c = KND&lt;br /&gt;
 | Kryosis_c = KRS&lt;br /&gt;
 | Krytenia_c = KRY&lt;br /&gt;
 | Legalese_c = LGL&lt;br /&gt;
 | Lerujka_c = LER&lt;br /&gt;
 | Limey George_c = LMG&lt;br /&gt;
 | Lisander_c = LIS&lt;br /&gt;
 | Lovisa_c = LOV&lt;br /&gt;
 | Mareibat_c = MBT&lt;br /&gt;
 | Marmaladaica_c = MRM&lt;br /&gt;
 | Maryloupe_c = MRL&lt;br /&gt;
 | Mavinet_c = MVN&lt;br /&gt;
 | Melayu Archipelago_c = MLY&lt;br /&gt;
 | Mercedini_c = MRC&lt;br /&gt;
 | Mitra and Soma_c = MSM&lt;br /&gt;
 | Mkabia_c = MKB&lt;br /&gt;
 | Mriin_c = MRN&lt;br /&gt;
 | Murphtannia_c = MUR&lt;br /&gt;
 | Mytanija_c = MYT&lt;br /&gt;
 | Nacaltora_c = NAC&lt;br /&gt;
 | Nephara_c = NPH&lt;br /&gt;
 | New Cloudsdale_c = NCL&lt;br /&gt;
 | New Lusitania_c = NLA&lt;br /&gt;
 | New Lusitanian Ultramar_c = NLU&lt;br /&gt;
 | New Zanga_c = NZG&lt;br /&gt;
 | North New South Wales_c = NNW&lt;br /&gt;
 | North Quadana_c = NQU&lt;br /&gt;
 | Northwest Kalactin_c = NWK&lt;br /&gt;
 | Nova Anglicana_c = NOV&lt;br /&gt;
 | Novum-castrum_c = NVC&lt;br /&gt;
 | Oberour Ar Moro_c = OAM&lt;br /&gt;
 | Olastor_c = OLA&lt;br /&gt;
 | Omerica_c = OME&lt;br /&gt;
 | Osarius_c = OSR&lt;br /&gt;
 | Pasarga_c = PAS&lt;br /&gt;
 | Pauh Janggi_c = PJI&lt;br /&gt;
 | Pemecutan_c = PCU&lt;br /&gt;
 | Plane of Possibility_c = POP&lt;br /&gt;
 | Poafmersia_c = PFA&lt;br /&gt;
 | Polkopia_c = PLK&lt;br /&gt;
 | Prahecq_c = PRH&lt;br /&gt;
 | Pridnestrovia_c = PDN&lt;br /&gt;
 | Pripet Socialist Republic_c = PSR&lt;br /&gt;
 | Qusmo_c = QUS&lt;br /&gt;
 | Ravenweather_c = RVR&lt;br /&gt;
 | Recuecn_c = RCN&lt;br /&gt;
 | Robostania_c = RBS&lt;br /&gt;
 | Royal Kingdom of Quebec_c = QUE&lt;br /&gt;
 | Sajnur_c = SAJ&lt;br /&gt;
 | Saltstead_c = SAL&lt;br /&gt;
 | San Felix_c = SFX&lt;br /&gt;
 | Sankt Konrad_c = SKR&lt;br /&gt;
 | Savigliane_c = SVG&lt;br /&gt;
 | Savojarna_c = SVJ&lt;br /&gt;
 | Schottia_c = SCT&lt;br /&gt;
 | Semarland_c = SEM&lt;br /&gt;
 | Seraxinbourgh_c = SRX&lt;br /&gt;
 | Sharktail_c = SHT&lt;br /&gt;
 | Siovanija and Teusland_c = STL&lt;br /&gt;
 | Soracana Islands_c = JSC&lt;br /&gt;
 | Soute_c = SOU&lt;br /&gt;
 | South Newlandia_c = SNL&lt;br /&gt;
 | Southern Palm Islands_c = SPI&lt;br /&gt;
 | Springmont_c = SPM&lt;br /&gt;
 | Squidroidia_c = SQR&lt;br /&gt;
 | Squornshelan Remnant States_c = SRS&lt;br /&gt;
 | Starblaydia_c = STB&lt;br /&gt;
 | Starcom Racing_c = SCM&lt;br /&gt;
 | Steelbaron_c = SEB&lt;br /&gt;
 | Sticiano_c = STI&lt;br /&gt;
 | StrayaRoos_c = STR&lt;br /&gt;
 | Sylestone_c = SYL&lt;br /&gt;
 | Taeshan_c = TAE&lt;br /&gt;
 | Talamia_c = TAL&lt;br /&gt;
 | Tamgu_c = TMG&lt;br /&gt;
 | Tequilo_c = TEQ&lt;br /&gt;
 | Terre Septentrionale_c = RTS&lt;br /&gt;
 | The Cross Islands_c = CRS&lt;br /&gt;
 | The Golden Lotus_c = LOT&lt;br /&gt;
 | The Gothanita Isles_c = GTI&lt;br /&gt;
 | The Grearish Union_c = GRU&lt;br /&gt;
 | The Jovannic_c = JOV&lt;br /&gt;
 | The Quagpire_c = QGP&lt;br /&gt;
 | The Sarian_c = TSA&lt;br /&gt;
 | Tikariot_c = TKT&lt;br /&gt;
 | Timuria_c = TMR&lt;br /&gt;
 | Tinhampton_c = TIN&lt;br /&gt;
 | Tobar Gainimh_c = TBG&lt;br /&gt;
 | Tobiasia_c = TOB&lt;br /&gt;
 | Torisakia_c = TOR&lt;br /&gt;
 | Tumbra_c = TMB&lt;br /&gt;
 | Turori_c = TUR&lt;br /&gt;
 | Unified Legandia_c = ULG&lt;br /&gt;
 | Union of Socialist Alpine Republics_c = UAR&lt;br /&gt;
 | Valanora_c = VAL&lt;br /&gt;
 | Valladares_c = VLD&lt;br /&gt;
 | Velestria_c = VLZ&lt;br /&gt;
 | Vilita_c = VIL&lt;br /&gt;
 | Wara-Salas_c = WRS&lt;br /&gt;
 | Whirl Islands_c = WRL&lt;br /&gt;
 | Xanneria_c = XAN&lt;br /&gt;
 | Xiaolin_c = XIA&lt;br /&gt;
 | Yuezhou_c = YZH&lt;br /&gt;
 | Yguazú_c = YGZ&lt;br /&gt;
 | Zeniyadh_c = ZNY&lt;br /&gt;
 | Zeta Reka &amp;amp; Hügeltaldom_c = ZRH&lt;br /&gt;
 | Ziwana_c = ZIW&lt;br /&gt;
 | Zwangzug_c = ZWZ&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;{{documentation|Template:Fba/core/doc}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:SportIcon&amp;diff=76917</id>
		<title>Template:SportIcon</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:SportIcon&amp;diff=76917"/>
		<updated>2026-09-30T09:22:50Z</updated>

		<summary type="html">&lt;p&gt;Osarius: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch: {{{sport|{{{2}}}}}}&lt;br /&gt;
| Soccer            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⚽]]&lt;br /&gt;
| Football          = [[{{{override|Association Football}}} in {{{nation|{{{1}}}}}}|⚽]]&lt;br /&gt;
| Boxing            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥊]]&lt;br /&gt;
| Kickboxing        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥊]]&lt;br /&gt;
| Combat            = [[{{{override|Combat Sports}}} in {{{nation|{{{1}}}}}}|🥊]]&lt;br /&gt;
| Judo              = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Taekwondo         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Karate            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Martial Arts      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Athletics         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏅]]&lt;br /&gt;
| Track &amp;amp; Field     = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏅]]&lt;br /&gt;
| Gridiron          = [[{{{override|Gridiron Football}}} in {{{nation|{{{1}}}}}}|🏈]]&lt;br /&gt;
| American Football = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏈]]&lt;br /&gt;
| Hockey            = [[{{{override|Ice Hockey}}} in {{{nation|{{{1}}}}}}|🏒]]&lt;br /&gt;
| Ice Hockey        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏒]]&lt;br /&gt;
| Field Hockey      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏑]]&lt;br /&gt;
| Basketball        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏀]]&lt;br /&gt;
| Rugby             = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏉]]&lt;br /&gt;
| Cricket           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏏]]&lt;br /&gt;
| Chess             = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|♟️]]&lt;br /&gt;
| Horse Racing      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏇]]&lt;br /&gt;
| Racing            = [[{{{override|Motor Sports}}} in {{{nation|{{{1}}}}}}|🏁]]&lt;br /&gt;
| Motor Racing      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏎]]&lt;br /&gt;
| Motorcycles       = [[{{{override|Motorcycle Racing}}} in {{{nation|{{{1}}}}}}|🏍]]&lt;br /&gt;
| Archery           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎯]]&lt;br /&gt;
| Wrestling         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🤼]]&lt;br /&gt;
| Pro Wrestling     = [[{{{override|Professional Wrestling}}} in {{{nation|{{{1}}}}}}|👹]]&lt;br /&gt;
| Baseball          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⚾]]&lt;br /&gt;
| Tennis            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎾]]&lt;br /&gt;
| Badminton         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏸]]&lt;br /&gt;
| Snowboarding      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏂]]&lt;br /&gt;
| Skiing            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎿]]&lt;br /&gt;
| Surfing           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏄]]&lt;br /&gt;
| Golf              = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⛳]]&lt;br /&gt;
| Volleyball        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏐]]&lt;br /&gt;
| Table Tennis      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏓]]&lt;br /&gt;
| Esports           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎮]]&lt;br /&gt;
| Handball          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🤾]]&lt;br /&gt;
| Lacrosse          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥍]]&lt;br /&gt;
| Cycling           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🚲]]&lt;br /&gt;
| Skateboarding     = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🛹]]&lt;br /&gt;
| Sailing           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⛵]]&lt;br /&gt;
| Swimming          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏊]]&lt;br /&gt;
| #default          = [[Sports in {{{nation|{{{1}}}}}}|🏅]]&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;__NOTOC__&lt;br /&gt;
==Usage==&lt;br /&gt;
Useful for summarising sports in a nation, or series of nations within a table or infobox without cluttering things up with lengthy links. See [[User:Osarius#My nations|here]] for an example usage.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;nation&#039;&#039;&#039; is required, while the &#039;&#039;&#039;sport&#039;&#039;&#039; passed determines which icon is linked.&amp;lt;br /&amp;gt;&lt;br /&gt;
If no sport is passed, the link will default to a medal icon (🏅) and &amp;quot;Sports in NATION&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For example:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Football|nation=Osarius}}&amp;lt;/nowiki&amp;gt; produces {{SportIcon|sport=Football|nation=Osarius}}, which links to &#039;&#039;&amp;quot;Association Football in Osarius&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The default link value is usually the &#039;&#039;&#039;sport&#039;&#039;&#039;, but some exceptions exist.&amp;lt;br /&amp;gt;&lt;br /&gt;
Regardless of the default behaviour, this can also be overridden with the &#039;&#039;&#039;override&#039;&#039;&#039; parameter.&amp;lt;br /&amp;gt;&lt;br /&gt;
So passing override=&amp;quot;Team Sports&amp;quot; when using sport=&amp;quot;Football&amp;quot; will link to &#039;&#039;&amp;quot;Team Sports in NATION&amp;quot;&#039;&#039; but show the soccer ball icon.&lt;br /&gt;
&lt;br /&gt;
This behaviour is useful for nations which use a different name for a sport to the generally accepted convention, such as Association Football being called &amp;quot;Hoofball&amp;quot; in [[Equestria]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For example:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}&amp;lt;/nowiki&amp;gt; produces {{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}, which displays the &amp;quot;Athletics&amp;quot; symbol (as seen in the table below), but links to &#039;&#039;&amp;quot;Track &amp;amp; Field Athletics Competitions in Aquillian&amp;quot;&#039;&#039; because of the value passed to &#039;&#039;&#039;override&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Unnamed parameters===&lt;br /&gt;
You can also use the template without labelling your parameters. It expects them to be in the order: &#039;&#039;&#039;nation, sport, override&#039;&#039;&#039;. Only &#039;&#039;&#039;nation&#039;&#039;&#039; is mandatory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For example:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;{{SportIcon|Osarius|Football}}&amp;lt;/nowiki&amp;gt; will produce the same output as &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Football|nation=Osarius}}&amp;lt;/nowiki&amp;gt;: {{SportIcon|Osarius|Football}}, linking to &amp;quot;Association Football in Osarius&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{SportIcon|Athletics|Aquillian|Track &amp;amp; Field Athletics Competitions}}&amp;lt;/nowiki&amp;gt; will produce the same output as &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}&amp;lt;/nowiki&amp;gt; : {{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{SportIcon|Cobrio}}&amp;lt;/nowiki&amp;gt; will produce generic link to &amp;quot;Sports in NATION&amp;quot;, using the default icon, like so: {{SportIcon|Cobrio}}&amp;lt;br /&amp;gt;&lt;br /&gt;
This final case is because the other two values are not mandatory. When no sport is present, the template defaults to &amp;quot;Sports in&amp;quot; and uses the medal icon. With no override, the default link remains unchanged.&lt;br /&gt;
&lt;br /&gt;
==Supported Values==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Icon !! Sport Values&lt;br /&gt;
|-&lt;br /&gt;
| 🏅 || Athletics, Track &amp;amp; Field, (default)&lt;br /&gt;
|-&lt;br /&gt;
| ⚽ || Soccer, Football&lt;br /&gt;
|-&lt;br /&gt;
| 🥊 || Boxing, Kickboxing, Combat&lt;br /&gt;
|-&lt;br /&gt;
| 🥋 || Judo, Taekwondo, Karate, Martial Arts&lt;br /&gt;
|-&lt;br /&gt;
| 🏈 || Gridiron, American Football&lt;br /&gt;
|-&lt;br /&gt;
| 🏒 || Hockey, Ice Hockey&lt;br /&gt;
|-&lt;br /&gt;
| 🏉 || Rugby&lt;br /&gt;
|-&lt;br /&gt;
| 🏏 || Cricket&lt;br /&gt;
|-&lt;br /&gt;
| 🏇 || Horse Racing&lt;br /&gt;
|-&lt;br /&gt;
| ⚾ || Baseball&lt;br /&gt;
|-&lt;br /&gt;
| 🎯 || Archery&lt;br /&gt;
|-&lt;br /&gt;
| 🏁 || Racing&lt;br /&gt;
|-&lt;br /&gt;
| 🏎 || Motor Racing&lt;br /&gt;
|-&lt;br /&gt;
| 🏍 || Motorcycles&lt;br /&gt;
|-&lt;br /&gt;
| 🤼 || Wrestling&lt;br /&gt;
|-&lt;br /&gt;
| 🎾 || Tennis&lt;br /&gt;
|-&lt;br /&gt;
| ♟️ || Chess&lt;br /&gt;
|-&lt;br /&gt;
| 🏂 || Snowboarding&lt;br /&gt;
|-&lt;br /&gt;
| 🏄 || Surfing&lt;br /&gt;
|-&lt;br /&gt;
| 🎿 || Skiing&lt;br /&gt;
|-&lt;br /&gt;
| 🏊 || Swimming&lt;br /&gt;
|-&lt;br /&gt;
| ⛳ || Golf&lt;br /&gt;
|-&lt;br /&gt;
| 🏐 || Volleyball&lt;br /&gt;
|-&lt;br /&gt;
| 🏑 || Field Hockey&lt;br /&gt;
|-&lt;br /&gt;
| 🏓 || Table Tennis&lt;br /&gt;
|-&lt;br /&gt;
| 🏸 || Badminton&lt;br /&gt;
|-&lt;br /&gt;
| 🎮 || Esports&lt;br /&gt;
|-&lt;br /&gt;
| 🤾 || Handball&lt;br /&gt;
|-&lt;br /&gt;
| 🥍 || Lacrosse&lt;br /&gt;
|-&lt;br /&gt;
| 🚲 || Cycling&lt;br /&gt;
|-&lt;br /&gt;
| 🛹 || Skateboarding&lt;br /&gt;
|-&lt;br /&gt;
| ⛵ || Sailing&lt;br /&gt;
|-&lt;br /&gt;
| ⛸️ || Ice Skating&lt;br /&gt;
|-&lt;br /&gt;
| 👹 || Pro Wrestling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Different Default Values===&lt;br /&gt;
The following values can be passed as the sport parameter, but default to a different link value&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sport Value !! Icon !! Default Link&lt;br /&gt;
|-&lt;br /&gt;
| Football      || ⚽ || Association Football&lt;br /&gt;
|-&lt;br /&gt;
| Gridiron      || 🏈 || Gridiron Football&lt;br /&gt;
|-&lt;br /&gt;
| Combat        || 🥊 || Combat Sports&lt;br /&gt;
|-&lt;br /&gt;
| Hockey        || 🏒 || Ice Hockey&lt;br /&gt;
|-&lt;br /&gt;
| Racing        || 🏁 || Motor Sports&lt;br /&gt;
|-&lt;br /&gt;
| Motorcycles   || 🏍 || Motorcycle Racing&lt;br /&gt;
|-&lt;br /&gt;
| Pro Wrestling || 👹 || Professional Wrestling&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:SportIcon&amp;diff=76916</id>
		<title>Template:SportIcon</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:SportIcon&amp;diff=76916"/>
		<updated>2026-09-30T08:29:21Z</updated>

		<summary type="html">&lt;p&gt;Osarius: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch: {{{sport|{{{2}}}}}}&lt;br /&gt;
| Soccer            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⚽]]&lt;br /&gt;
| Football          = [[{{{override|Association Football}}} in {{{nation|{{{1}}}}}}|⚽]]&lt;br /&gt;
| Boxing            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥊]]&lt;br /&gt;
| Kickboxing        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥊]]&lt;br /&gt;
| Combat            = [[{{{override|Combat Sports}}} in {{{nation|{{{1}}}}}}|🥊]]&lt;br /&gt;
| Judo              = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Taekwondo         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Karate            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Martial Arts      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Athletics         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏅]]&lt;br /&gt;
| Track &amp;amp; Field     = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏅]]&lt;br /&gt;
| Gridiron          = [[{{{override|Gridiron Football}}} in {{{nation|{{{1}}}}}}|🏈]]&lt;br /&gt;
| American Football = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏈]]&lt;br /&gt;
| Hockey            = [[{{{override|Ice Hockey}}} in {{{nation|{{{1}}}}}}|🏒]]&lt;br /&gt;
| Ice Hockey        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏒]]&lt;br /&gt;
| Field Hockey      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏑]]&lt;br /&gt;
| Basketball        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏀]]&lt;br /&gt;
| Rugby             = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏉]]&lt;br /&gt;
| Cricket           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏏]]&lt;br /&gt;
| Chess             = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|♟️]]&lt;br /&gt;
| Horse Racing      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏇]]&lt;br /&gt;
| Racing            = [[{{{override|Motor Sports}}} in {{{nation|{{{1}}}}}}|🏁]]&lt;br /&gt;
| Motor Racing      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏎]]&lt;br /&gt;
| Motorcycles       = [[{{{override|Motorcycle Racing}}} in {{{nation|{{{1}}}}}}|🏍]]&lt;br /&gt;
| Archery           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎯]]&lt;br /&gt;
| Wrestling         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🤼]]&lt;br /&gt;
| Pro Wrestling     = [[{{{override|Professional Wrestling}}} in {{{nation|{{{1}}}}}}|👹]]&lt;br /&gt;
| Baseball          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⚾]]&lt;br /&gt;
| Tennis            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎾]]&lt;br /&gt;
| Badminton         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏸]]&lt;br /&gt;
| Snowboarding      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏂]]&lt;br /&gt;
| Skiing            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎿]]&lt;br /&gt;
| Surfing           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏄]]&lt;br /&gt;
| Golf              = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⛳]]&lt;br /&gt;
| Volleyball        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏐]]&lt;br /&gt;
| Table Tennis      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏓]]&lt;br /&gt;
| Esports           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎮]]&lt;br /&gt;
| Handball          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🤾]]&lt;br /&gt;
| Lacrosse          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥍]]&lt;br /&gt;
| Cycling           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🚲]]&lt;br /&gt;
| Skateboarding     = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🛹]]&lt;br /&gt;
| Sailing           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⛵]]&lt;br /&gt;
| Swimming          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏊]]&lt;br /&gt;
| #default          = [[Sports in {{{nation|{{{1}}}}}}|🏅]]&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;__NOTOC__&lt;br /&gt;
==Usage==&lt;br /&gt;
Useful for summarising sports in a nation, or series of nations within a table or infobox without cluttering things up with lengthy links. See [[User:Osarius#My nations|here]] for an example usage.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;nation&#039;&#039;&#039; is required, while the &#039;&#039;&#039;sport&#039;&#039;&#039; passed determines which icon is linked.&amp;lt;br /&amp;gt;&lt;br /&gt;
If no sport is passed, the link will default to a medal icon (🏅) and &amp;quot;Sports in NATION&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For example:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Football|nation=Osarius}}&amp;lt;/nowiki&amp;gt; produces {{SportIcon|sport=Football|nation=Osarius}}, which links to &#039;&#039;&amp;quot;Association Football in Osarius&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The default link value is usually the &#039;&#039;&#039;sport&#039;&#039;&#039;, but some exceptions exist.&amp;lt;br /&amp;gt;&lt;br /&gt;
Regardless of the default behaviour, this can also be overridden with the &#039;&#039;&#039;override&#039;&#039;&#039; parameter.&amp;lt;br /&amp;gt;&lt;br /&gt;
So passing override=&amp;quot;Team Sports&amp;quot; when using sport=&amp;quot;Football&amp;quot; will link to &#039;&#039;&amp;quot;Team Sports in NATION&amp;quot;&#039;&#039; but show the soccer ball icon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For example:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}&amp;lt;/nowiki&amp;gt; produces {{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}, which displays the &amp;quot;Athletics&amp;quot; symbol (as seen in the table below), but links to &#039;&#039;&amp;quot;Track &amp;amp; Field Athletics Competitions in Aquillian&amp;quot;&#039;&#039; because of the value passed to &#039;&#039;&#039;override&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Unnamed parameters===&lt;br /&gt;
You can also use the template without labelling your parameters. It expects them to be in the order: &#039;&#039;&#039;nation, sport, override&#039;&#039;&#039;. Only &#039;&#039;&#039;nation&#039;&#039;&#039; is mandatory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For example:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;{{SportIcon|Osarius|Football}}&amp;lt;/nowiki&amp;gt; will produce the same output as &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Football|nation=Osarius}}&amp;lt;/nowiki&amp;gt;: {{SportIcon|Osarius|Football}}, linking to &amp;quot;Association Football in Osarius&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{SportIcon|Athletics|Aquillian|Track &amp;amp; Field Athletics Competitions}}&amp;lt;/nowiki&amp;gt; will produce the same output as &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}&amp;lt;/nowiki&amp;gt; : {{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{SportIcon|Cobrio}}&amp;lt;/nowiki&amp;gt; will produce generic link to &amp;quot;Sports in NATION&amp;quot;, using the default icon, like so: {{SportIcon|Cobrio}}&amp;lt;br /&amp;gt;&lt;br /&gt;
This final case is because the other two values are not mandatory. When no sport is present, the template defaults to &amp;quot;Sports in&amp;quot; and uses the medal icon. With no override, the default link remains unchanged.&lt;br /&gt;
&lt;br /&gt;
==Supported Values==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Icon !! Sport Values&lt;br /&gt;
|-&lt;br /&gt;
| 🏅 || Athletics, Track &amp;amp; Field, (default)&lt;br /&gt;
|-&lt;br /&gt;
| ⚽ || Soccer, Football&lt;br /&gt;
|-&lt;br /&gt;
| 🥊 || Boxing, Kickboxing, Combat&lt;br /&gt;
|-&lt;br /&gt;
| 🥋 || Judo, Taekwondo, Karate, Martial Arts&lt;br /&gt;
|-&lt;br /&gt;
| 🏈 || Gridiron, American Football&lt;br /&gt;
|-&lt;br /&gt;
| 🏒 || Hockey, Ice Hockey&lt;br /&gt;
|-&lt;br /&gt;
| 🏉 || Rugby&lt;br /&gt;
|-&lt;br /&gt;
| 🏏 || Cricket&lt;br /&gt;
|-&lt;br /&gt;
| 🏇 || Horse Racing&lt;br /&gt;
|-&lt;br /&gt;
| ⚾ || Baseball&lt;br /&gt;
|-&lt;br /&gt;
| 🎯 || Archery&lt;br /&gt;
|-&lt;br /&gt;
| 🏁 || Racing&lt;br /&gt;
|-&lt;br /&gt;
| 🏎 || Motor Racing&lt;br /&gt;
|-&lt;br /&gt;
| 🏍 || Motorcycles&lt;br /&gt;
|-&lt;br /&gt;
| 🤼 || Wrestling&lt;br /&gt;
|-&lt;br /&gt;
| 🎾 || Tennis&lt;br /&gt;
|-&lt;br /&gt;
| ♟️ || Chess&lt;br /&gt;
|-&lt;br /&gt;
| 🏂 || Snowboarding&lt;br /&gt;
|-&lt;br /&gt;
| 🏄 || Surfing&lt;br /&gt;
|-&lt;br /&gt;
| 🎿 || Skiing&lt;br /&gt;
|-&lt;br /&gt;
| 🏊 || Swimming&lt;br /&gt;
|-&lt;br /&gt;
| ⛳ || Golf&lt;br /&gt;
|-&lt;br /&gt;
| 🏐 || Volleyball&lt;br /&gt;
|-&lt;br /&gt;
| 🏑 || Field Hockey&lt;br /&gt;
|-&lt;br /&gt;
| 🏓 || Table Tennis&lt;br /&gt;
|-&lt;br /&gt;
| 🏸 || Badminton&lt;br /&gt;
|-&lt;br /&gt;
| 🎮 || Esports&lt;br /&gt;
|-&lt;br /&gt;
| 🤾 || Handball&lt;br /&gt;
|-&lt;br /&gt;
| 🥍 || Lacrosse&lt;br /&gt;
|-&lt;br /&gt;
| 🚲 || Cycling&lt;br /&gt;
|-&lt;br /&gt;
| 🛹 || Skateboarding&lt;br /&gt;
|-&lt;br /&gt;
| ⛵ || Sailing&lt;br /&gt;
|-&lt;br /&gt;
| ⛸️ || Ice Skating&lt;br /&gt;
|-&lt;br /&gt;
| 👹 || Pro Wrestling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Different Default Values===&lt;br /&gt;
The following values can be passed as the sport parameter, but default to a different link value&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sport Value !! Icon !! Default Link&lt;br /&gt;
|-&lt;br /&gt;
| Football      || ⚽ || Association Football&lt;br /&gt;
|-&lt;br /&gt;
| Gridiron      || 🏈 || Gridiron Football&lt;br /&gt;
|-&lt;br /&gt;
| Combat        || 🥊 || Combat Sports&lt;br /&gt;
|-&lt;br /&gt;
| Hockey        || 🏒 || Ice Hockey&lt;br /&gt;
|-&lt;br /&gt;
| Racing        || 🏁 || Motor Sports&lt;br /&gt;
|-&lt;br /&gt;
| Motorcycles   || 🏍 || Motorcycle Racing&lt;br /&gt;
|-&lt;br /&gt;
| Pro Wrestling || 👹 || Professional Wrestling&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:SportIcon&amp;diff=76915</id>
		<title>Template:SportIcon</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:SportIcon&amp;diff=76915"/>
		<updated>2026-09-30T08:26:46Z</updated>

		<summary type="html">&lt;p&gt;Osarius: /* Unnamed parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch: {{{sport|{{{2}}}}}}&lt;br /&gt;
| Soccer            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⚽]]&lt;br /&gt;
| Football          = [[{{{override|Association Football}}} in {{{nation|{{{1}}}}}}|⚽]]&lt;br /&gt;
| Boxing            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥊]]&lt;br /&gt;
| Kickboxing        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥊]]&lt;br /&gt;
| Combat            = [[{{{override|Combat Sports}}} in {{{nation|{{{1}}}}}}|🥊]]&lt;br /&gt;
| Judo              = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Taekwondo         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Karate            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Martial Arts      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥋]]&lt;br /&gt;
| Athletics         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏅]]&lt;br /&gt;
| Track &amp;amp; Field     = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏅]]&lt;br /&gt;
| Gridiron          = [[{{{override|Gridiron Football}}} in {{{nation|{{{1}}}}}}|🏈]]&lt;br /&gt;
| American Football = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏈]]&lt;br /&gt;
| Hockey            = [[{{{override|Ice Hockey}}} in {{{nation|{{{1}}}}}}|🏒]]&lt;br /&gt;
| Ice Hockey        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏒]]&lt;br /&gt;
| Field Hockey      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏑]]&lt;br /&gt;
| Basketball        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏀]]&lt;br /&gt;
| Rugby             = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏉]]&lt;br /&gt;
| Cricket           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏏]]&lt;br /&gt;
| Chess             = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|♟️]]&lt;br /&gt;
| Horse Racing      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏇]]&lt;br /&gt;
| Racing            = [[{{{override|Motor Sports}}} in {{{nation|{{{1}}}}}}|🏁]]&lt;br /&gt;
| Motor Racing      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏎]]&lt;br /&gt;
| Motorcycles       = [[{{{override|Motorcycle Racing}}} in {{{nation|{{{1}}}}}}|🏍]]&lt;br /&gt;
| Archery           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎯]]&lt;br /&gt;
| Wrestling         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🤼]]&lt;br /&gt;
| Pro Wrestling     = [[{{{override|Professional Wrestling}}} in {{{nation|{{{1}}}}}}|👹]]&lt;br /&gt;
| Baseball          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⚾]]&lt;br /&gt;
| Tennis            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎾]]&lt;br /&gt;
| Badminton         = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏸]]&lt;br /&gt;
| Snowboarding      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏂]]&lt;br /&gt;
| Skiing            = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎿]]&lt;br /&gt;
| Surfing           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏄]]&lt;br /&gt;
| Golf              = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⛳]]&lt;br /&gt;
| Volleyball        = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏐]]&lt;br /&gt;
| Table Tennis      = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏓]]&lt;br /&gt;
| Esports           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🎮]]&lt;br /&gt;
| Handball          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🤾]]&lt;br /&gt;
| Lacrosse          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🥍]]&lt;br /&gt;
| Cycling           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🚲]]&lt;br /&gt;
| Skateboarding     = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🛹]]&lt;br /&gt;
| Sailing           = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|⛵]]&lt;br /&gt;
| Swimming          = [[{{{override|{{{3|{{{sport|{{{2}}}}}}}}}}}} in {{{nation|{{{1}}}}}}|🏊]]&lt;br /&gt;
| #default          = [[Sports in {{{nation|{{{1}}}}}}|🏅]]&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;__NOTOC__&lt;br /&gt;
==Usage==&lt;br /&gt;
Useful for summarising sports in a nation, or series of nations within a table or infobox without cluttering things up with lengthy links. See [[User:Osarius#My nations|here]] for an example usage.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;nation&#039;&#039;&#039; is required, while the &#039;&#039;&#039;sport&#039;&#039;&#039; passed determines which icon is linked.&amp;lt;br /&amp;gt;&lt;br /&gt;
If no sport is passed, the link will default to a medal icon (🏅) and &amp;quot;Sports in NATION&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For example:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Football|nation=Osarius}}&amp;lt;/nowiki&amp;gt; produces {{SportIcon|sport=Football|nation=Osarius}}, which links to &#039;&#039;&amp;quot;Association Football in Osarius&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The default link value is usually the &#039;&#039;&#039;sport&#039;&#039;&#039;, but some exceptions exist.&amp;lt;br /&amp;gt;&lt;br /&gt;
Regardless of the default behaviour, this can also be overridden with the &#039;&#039;&#039;override&#039;&#039;&#039; parameter.&amp;lt;br /&amp;gt;&lt;br /&gt;
So passing override=&amp;quot;Team Sports&amp;quot; when using sport=&amp;quot;Football&amp;quot; will link to &#039;&#039;&amp;quot;Team Sports in NATION&amp;quot;&#039;&#039; but show the soccer ball icon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For example:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}&amp;lt;/nowiki&amp;gt; produces {{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}, which displays the &amp;quot;Athletics&amp;quot; symbol (as seen in the table below), but links to &#039;&#039;&amp;quot;Track &amp;amp; Field Athletics Competitions in Aquillian&amp;quot;&#039;&#039; because of the value passed to &#039;&#039;&#039;override&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Unnamed parameters===&lt;br /&gt;
You can also use the template without labelling your parameters. It expects them to be in the order: &#039;&#039;&#039;nation, sport, override&#039;&#039;&#039;. Only &#039;&#039;&#039;nation&#039;&#039;&#039; is mandatory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For example:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;{{SportIcon|Osarius|Football}}&amp;lt;/nowiki&amp;gt; will produce the same output as &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Football|nation=Osarius}}&amp;lt;/nowiki&amp;gt;: {{SportIcon|Football|Osarius}}, linking to &amp;quot;Association Football in Osarius&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{SportIcon|Athletics|Aquillian|Track &amp;amp; Field Athletics Competitions}}&amp;lt;/nowiki&amp;gt; will produce the same output as &amp;lt;nowiki&amp;gt;{{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}&amp;lt;/nowiki&amp;gt; : {{SportIcon|sport=Athletics|nation=Aquillian|override=Track &amp;amp; Field Athletics Competitions}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{SportIcon|Cobrio}}&amp;lt;/nowiki&amp;gt; will produce generic link to &amp;quot;Sports in NATION&amp;quot;, using the default icon, like so: {{SportIcon|Cobrio}}&amp;lt;br /&amp;gt;&lt;br /&gt;
This final case is because the other two values are not mandatory. When no sport is present, the template defaults to &amp;quot;Sports in&amp;quot; and uses the medal icon. With no override, the default link remains unchanged.&lt;br /&gt;
&lt;br /&gt;
==Supported Values==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Icon !! Sport Values&lt;br /&gt;
|-&lt;br /&gt;
| 🏅 || Athletics, Track &amp;amp; Field, (default)&lt;br /&gt;
|-&lt;br /&gt;
| ⚽ || Soccer, Football&lt;br /&gt;
|-&lt;br /&gt;
| 🥊 || Boxing, Kickboxing, Combat&lt;br /&gt;
|-&lt;br /&gt;
| 🥋 || Judo, Taekwondo, Karate, Martial Arts&lt;br /&gt;
|-&lt;br /&gt;
| 🏈 || Gridiron, American Football&lt;br /&gt;
|-&lt;br /&gt;
| 🏒 || Hockey, Ice Hockey&lt;br /&gt;
|-&lt;br /&gt;
| 🏉 || Rugby&lt;br /&gt;
|-&lt;br /&gt;
| 🏏 || Cricket&lt;br /&gt;
|-&lt;br /&gt;
| 🏇 || Horse Racing&lt;br /&gt;
|-&lt;br /&gt;
| ⚾ || Baseball&lt;br /&gt;
|-&lt;br /&gt;
| 🎯 || Archery&lt;br /&gt;
|-&lt;br /&gt;
| 🏁 || Racing&lt;br /&gt;
|-&lt;br /&gt;
| 🏎 || Motor Racing&lt;br /&gt;
|-&lt;br /&gt;
| 🏍 || Motorcycles&lt;br /&gt;
|-&lt;br /&gt;
| 🤼 || Wrestling&lt;br /&gt;
|-&lt;br /&gt;
| 🎾 || Tennis&lt;br /&gt;
|-&lt;br /&gt;
| ♟️ || Chess&lt;br /&gt;
|-&lt;br /&gt;
| 🏂 || Snowboarding&lt;br /&gt;
|-&lt;br /&gt;
| 🏄 || Surfing&lt;br /&gt;
|-&lt;br /&gt;
| 🎿 || Skiing&lt;br /&gt;
|-&lt;br /&gt;
| 🏊 || Swimming&lt;br /&gt;
|-&lt;br /&gt;
| ⛳ || Golf&lt;br /&gt;
|-&lt;br /&gt;
| 🏐 || Volleyball&lt;br /&gt;
|-&lt;br /&gt;
| 🏑 || Field Hockey&lt;br /&gt;
|-&lt;br /&gt;
| 🏓 || Table Tennis&lt;br /&gt;
|-&lt;br /&gt;
| 🏸 || Badminton&lt;br /&gt;
|-&lt;br /&gt;
| 🎮 || Esports&lt;br /&gt;
|-&lt;br /&gt;
| 🤾 || Handball&lt;br /&gt;
|-&lt;br /&gt;
| 🥍 || Lacrosse&lt;br /&gt;
|-&lt;br /&gt;
| 🚲 || Cycling&lt;br /&gt;
|-&lt;br /&gt;
| 🛹 || Skateboarding&lt;br /&gt;
|-&lt;br /&gt;
| ⛵ || Sailing&lt;br /&gt;
|-&lt;br /&gt;
| ⛸️ || Ice Skating&lt;br /&gt;
|-&lt;br /&gt;
| 👹 || Pro Wrestling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Different Default Values===&lt;br /&gt;
The following values can be passed as the sport parameter, but default to a different link value&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sport Value !! Icon !! Default Link&lt;br /&gt;
|-&lt;br /&gt;
| Football      || ⚽ || Association Football&lt;br /&gt;
|-&lt;br /&gt;
| Gridiron      || 🏈 || Gridiron Football&lt;br /&gt;
|-&lt;br /&gt;
| Combat        || 🥊 || Combat Sports&lt;br /&gt;
|-&lt;br /&gt;
| Hockey        || 🏒 || Ice Hockey&lt;br /&gt;
|-&lt;br /&gt;
| Racing        || 🏁 || Motor Sports&lt;br /&gt;
|-&lt;br /&gt;
| Motorcycles   || 🏍 || Motorcycle Racing&lt;br /&gt;
|-&lt;br /&gt;
| Pro Wrestling || 👹 || Professional Wrestling&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=World_Cup_101_qualification/Playoffs&amp;diff=76415</id>
		<title>World Cup 101 qualification/Playoffs</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=World_Cup_101_qualification/Playoffs&amp;diff=76415"/>
		<updated>2026-07-24T19:46:51Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot; ==Playoffs== ===Bracket=== {{#invoke: Team bracket colspanfix | main |rounds=8|maxround=3|byes=3|legs=3|sepwidth=1|boldwinner=high|hideomittedscores = 1|aggregate=score|nowrap=yes|compact=no|small=yes | RD1-group1 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket A&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group3 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket B&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group5 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket C&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group7 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket D&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group9 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket E&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group11 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket F&amp;lt;/big&amp;gt;&amp;#039;&amp;#039; | RD1-group13 = &amp;#039;&amp;#039;&amp;lt;big&amp;gt;Bracket G...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Playoffs==&lt;br /&gt;
===Bracket===&lt;br /&gt;
{{#invoke: Team bracket colspanfix | main&lt;br /&gt;
|rounds=8|maxround=3|byes=3|legs=3|sepwidth=1|boldwinner=high|hideomittedscores = 1|aggregate=score|nowrap=yes|compact=no|small=yes&lt;br /&gt;
| RD1-group1 = &#039;&#039;&amp;lt;big&amp;gt;Bracket A&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group3 = &#039;&#039;&amp;lt;big&amp;gt;Bracket B&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group5 = &#039;&#039;&amp;lt;big&amp;gt;Bracket C&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group7 = &#039;&#039;&amp;lt;big&amp;gt;Bracket D&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group9 = &#039;&#039;&amp;lt;big&amp;gt;Bracket E&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group11 = &#039;&#039;&amp;lt;big&amp;gt;Bracket F&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group13 = &#039;&#039;&amp;lt;big&amp;gt;Bracket G&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group15 = &#039;&#039;&amp;lt;big&amp;gt;Bracket H&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group17 = &#039;&#039;&amp;lt;big&amp;gt;Bracket I&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group19 = &#039;&#039;&amp;lt;big&amp;gt;Bracket J&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group21 = &#039;&#039;&amp;lt;big&amp;gt;Bracket K&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group23 = &#039;&#039;&amp;lt;big&amp;gt;Bracket L&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group25 = &#039;&#039;&amp;lt;big&amp;gt;Bracket M&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
| RD1-group27 = &#039;&#039;&amp;lt;big&amp;gt;Bracket N&amp;lt;/big&amp;gt;&#039;&#039;&lt;br /&gt;
|RD1=Round One&lt;br /&gt;
|RD2=Round Two&lt;br /&gt;
|RD3=Round Three&lt;br /&gt;
&lt;br /&gt;
|RD1-team35={{fb|Calgasia}}|RD1-score35-1=2|RD1-score35-2=1&lt;br /&gt;
|RD1-team36={{fb|Captina Island}}|RD1-score36-1=1|RD1-score36-2=1&lt;br /&gt;
&lt;br /&gt;
|RD1-team43={{strikethrough|{{fb|Andossa Se Mitrin Vega}}}}|RD1-score43-1=1|RD1-score43-2=1&lt;br /&gt;
|RD1-team44={{fb|Russian Empire EHA}}|RD1-score44-1=0|RD1-score44-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team51={{fb|Tomerion }}|RD1-score51-1=0|RD1-score51-2=0&lt;br /&gt;
|RD1-team52={{fb|The Republic of the United Marble Tribes}}|RD1-score52-1=0|RD1-score52-2=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team59={{fb|Shin-Zetsubo}}|RD1-score59-1=1|RD1-score59-2=4&lt;br /&gt;
|RD1-team60={{fb|The Golden Harp}}|RD1-score60-1=2|RD1-score60-2=4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team67={{fb|Lisander}}|RD1-score67-1=2|RD1-score67-2=1|RD1-score67-3=1&lt;br /&gt;
|RD1-team68={{fb|The Martian Independent Republic}}|RD1-score68-1=0|RD1-score68-2=3|RD1-score68-3=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team75={{fb|Aamathyr}}|RD1-score75-1=2|RD1-score75-2=1&lt;br /&gt;
|RD1-team76={{fb|Atheara}}|RD1-score76-1=0|RD1-score76-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team83={{fb|Super Earth}}|RD1-score83-1=0|RD1-score83-2=0&lt;br /&gt;
|RD1-team84={{fb|Drawkland}}|RD1-score84-1=2|RD1-score84-2=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD1-team91={{fb|Siovanija and Teusland}}|RD1-score91-1=1|RD1-score91-2=1&lt;br /&gt;
|RD1-team92={{fb|Delaclava}}|RD1-score92-1=3|RD1-score92-2=1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--SF--&amp;gt;&lt;br /&gt;
|RD2-team1={{fb|Choppyhausen}}|RD2-score1-1=4|RD2-score1-2=1|RD2-score1-3=1&lt;br /&gt;
|RD2-team2={{fb|Katzeburg}}|RD2-score2-1=3|RD2-score2-2=2|RD2-score2-3=0&lt;br /&gt;
&lt;br /&gt;
|RD2-team5={{fb|Myrtle Beach}}|RD2-score5-1=3|RD2-score5-2=4&lt;br /&gt;
|RD2-team6={{fb|Auprussia}}|RD2-score6-1=2|RD2-score6-2=4&lt;br /&gt;
&lt;br /&gt;
|RD2-team9={{fb|Taeshan}}|RD2-score9-1=0|RD2-score9-2=1&lt;br /&gt;
|RD2-team10={{fb|Natkr}}|RD2-score10-1=2|RD2-score10-2=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team13={{fb|Smoltrendestof}}|RD2-score13-1=1|RD2-score13-2=0&lt;br /&gt;
|RD2-team14={{fb|Abanhfleft}}|RD2-score14-1=3|RD2-score14-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team17={{fb|Calgasia}}|RD2-score17-1=0|RD2-score17-2=0&lt;br /&gt;
|RD2-team18={{fb|The Ko-orenite Constellation}}|RD2-score18-1=0|RD2-score18-2=4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team21={{fb|Russian Empire EHA}}|RD2-score21-1=1|RD2-score21-2=0&lt;br /&gt;
|RD2-team22={{fb|Kelssek}}|RD2-score22-1=2|RD2-score22-2=4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team25={{fb|The Republic of the United Marble Tribes}}|RD2-score25-1=1|RD2-score25-2=0&lt;br /&gt;
|RD2-team26={{fb|Darmen}}|RD2-score26-1=1|RD2-score26-2=4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team29={{fb|The Golden Harp}}|RD2-score29-1=2|RD2-score29-2=0&lt;br /&gt;
|RD2-team30={{fb|Soviet Kem}}|RD2-score30-1=0|RD2-score30-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team33={{fb|The Martian Independent Republic}}|RD2-score33-1=1|RD2-score33-2=4&lt;br /&gt;
|RD2-team34={{fb|Kamijiro}}|RD2-score34-1=2|RD2-score34-2=5&lt;br /&gt;
&lt;br /&gt;
|RD2-team37={{fb|Aamathyr}}|RD2-score37-1=2|RD2-score37-2=1&lt;br /&gt;
|RD2-team38={{fb|Legalese}}|RD2-score38-1=1|RD2-score38-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team41={{fb|Drawkland}}|RD2-score41-1=2|RD2-score41-2=3&lt;br /&gt;
|RD2-team42={{fb|Milchama}}|RD2-score42-1=0|RD2-score42-2=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD2-team45={{fb|Delaclava}}|RD2-score45-1=0|RD2-score45-2=0&lt;br /&gt;
|RD2-team46={{fb|StrayaRoos}}|RD2-score46-1=0|RD2-score46-2=2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--F--&amp;gt;&lt;br /&gt;
|RD3-team1={{fb|Choppyhausen}}|RD3-score1-1=2|RD3-score1-2=2&lt;br /&gt;
|RD3-team2={{fb|Zwangzug}}|RD3-score2-1=0|RD3-score2-2=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team3={{fb|Myrtle Beach}}|RD3-score3-1=2|RD3-score3-2=1|RD3-score3-3=2&lt;br /&gt;
|RD3-team4={{fb|Edsmontik}}|RD3-score4-1=3|RD3-score4-2=0|RD3-score4-3=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team5={{fb|Natkr}}|RD3-score5-1=2|RD3-score5-2=1&lt;br /&gt;
|RD3-team6={{fb|Pomachetti}}|RD3-score6-1=2|RD3-score6-2=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team7={{fb|Abanhfleft}}|RD3-score7-1=1|RD3-score7-2=0&lt;br /&gt;
|RD3-team8={{fb|Kwrpania}}|RD3-score8-1=0|RD3-score8-2=4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team9={{fb|The Ko-orenite Constellation}}|RD3-score9-1=2|RD3-score9-2=1|RD3-score9-3=2&lt;br /&gt;
|RD3-team10={{fb|Dantopia}} {{aet}}|RD3-score10-1=1|RD3-score10-2=2|RD3-score10-3=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team11={{fb|Kelssek}}|RD3-score11-1=2|RD3-score11-2=0&lt;br /&gt;
|RD3-team12={{fb|TJUN-ia}}|RD3-score12-1=1|RD3-score12-2=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team13={{fb|Darmen}}|RD3-score13-1=4|RD3-score13-2=0|RD3-score13-3=1&lt;br /&gt;
|RD3-team14={{fb|Bostopia}}|RD3-score14-1=1|RD3-score14-2=3|RD3-score14-3=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team15={{fb|The Golden Harp}}|RD3-score15-1=3|RD3-score15-2=0&lt;br /&gt;
|RD3-team16={{fb|Sarzonia}}|RD3-score16-1=1|RD3-score16-2=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team17={{fb|Kamijiro}}|RD3-score17-1=2|RD3-score17-2=0&lt;br /&gt;
|RD3-team18={{fb|Sernet}}|RD3-score18-1=3|RD3-score18-2=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team19={{fb|Aamathyr}}|RD3-score19-1=0|RD3-score19-2=0&lt;br /&gt;
|RD3-team20={{fb|Hanalia}}|RD3-score20-1=2|RD3-score20-2=1&lt;br /&gt;
&lt;br /&gt;
|RD3-team21={{fb|Drawkland}}|RD3-score21-1=4|RD3-score21-2=2&lt;br /&gt;
|RD3-team22={{fb|Saterun}}|RD3-score22-1=2|RD3-score22-2=2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team23={{fb|StrayaRoos}}|RD3-score23-1=4|RD3-score23-2=3|RD3-score23-3=1&lt;br /&gt;
|RD3-team24={{fb|Biyambi}}|RD3-score24-1=4|RD3-score24-2=3|RD3-score24-3=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team25={{fb|HUElavia}}|RD3-score25-1=1|RD3-score25-2=2&lt;br /&gt;
|RD3-team26={{fb|Cobrio}}|RD3-score26-1=1|RD3-score26-2=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|RD3-team27={{fb|Airannia}}|RD3-score27-1=1|RD3-score27-2=1&lt;br /&gt;
|RD3-team28={{fb|Masraya}}|RD3-score28-1=1|RD3-score28-2=2&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Logic&amp;diff=76414</id>
		<title>Module:Build bracket/Logic</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Logic&amp;diff=76414"/>
		<updated>2026-07-24T10:50:38Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Logic = {}&lt;br /&gt;
&lt;br /&gt;
-- =======================&lt;br /&gt;
-- 1) STDLIB ALIASES&lt;br /&gt;
-- =======================&lt;br /&gt;
local m_max = math.max&lt;br /&gt;
local m_ceil = math.ceil&lt;br /&gt;
local s_match = string.match&lt;br /&gt;
local s_find = string.find&lt;br /&gt;
&lt;br /&gt;
-- =======================&lt;br /&gt;
-- 2) MODULE UPVALUES&lt;br /&gt;
-- =======================&lt;br /&gt;
local state, config, Helpers, StateChecks&lt;br /&gt;
local isempty, notempty, teamLegs&lt;br /&gt;
&lt;br /&gt;
local function bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    state, config, Helpers, StateChecks = _state, _config, _Helpers, _StateChecks&lt;br /&gt;
    isempty = _Helpers and _Helpers.isempty or function(v)&lt;br /&gt;
            return v == nil or v == &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    notempty = _Helpers and _Helpers.notempty or function(v)&lt;br /&gt;
            return v ~= nil and v ~= &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    teamLegs = _StateChecks and _StateChecks.teamLegs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =======================&lt;br /&gt;
-- 3) SMALL UTILITIES&lt;br /&gt;
-- =======================&lt;br /&gt;
-- Map common Unicode fraction characters to decimal&lt;br /&gt;
local fraction_map = {&lt;br /&gt;
    [&amp;quot;½&amp;quot;] = &amp;quot;.5&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅓&amp;quot;] = &amp;quot;.333&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅔&amp;quot;] = &amp;quot;.667&amp;quot;,&lt;br /&gt;
    [&amp;quot;¼&amp;quot;] = &amp;quot;.25&amp;quot;,&lt;br /&gt;
    [&amp;quot;¾&amp;quot;] = &amp;quot;.75&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅕&amp;quot;] = &amp;quot;.2&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅖&amp;quot;] = &amp;quot;.4&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅗&amp;quot;] = &amp;quot;.6&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅘&amp;quot;] = &amp;quot;.8&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅙&amp;quot;] = &amp;quot;.167&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅚&amp;quot;] = &amp;quot;.833&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅛&amp;quot;] = &amp;quot;.125&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅜&amp;quot;] = &amp;quot;.375&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅝&amp;quot;] = &amp;quot;.625&amp;quot;,&lt;br /&gt;
    [&amp;quot;⅞&amp;quot;] = &amp;quot;.875&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Normalize fractions like &amp;quot;1½&amp;quot; to &amp;quot;1.5&amp;quot;&lt;br /&gt;
local function normalizeFractions(s)&lt;br /&gt;
    -- Replace integer + fraction (e.g. &amp;quot;1½&amp;quot; → &amp;quot;1.5&amp;quot;)&lt;br /&gt;
    s =&lt;br /&gt;
        s:gsub(&lt;br /&gt;
        &amp;quot;(%d+)%s*([%z\1-\127\194-\244][\128-\191]*)&amp;quot;,&lt;br /&gt;
        function(d, frac)&lt;br /&gt;
            local repl = fraction_map[frac]&lt;br /&gt;
            if repl then&lt;br /&gt;
                return d .. repl&lt;br /&gt;
            else&lt;br /&gt;
                return d .. frac&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    -- Replace standalone fraction (e.g. &amp;quot;½&amp;quot; → &amp;quot;0.5&amp;quot;)&lt;br /&gt;
    s =&lt;br /&gt;
        s:gsub(&lt;br /&gt;
        &amp;quot;([%z\1-\127\194-\244][\128-\191]*)&amp;quot;,&lt;br /&gt;
        function(frac)&lt;br /&gt;
            local repl = fraction_map[frac]&lt;br /&gt;
            if repl then&lt;br /&gt;
                return &amp;quot;0&amp;quot; .. repl&lt;br /&gt;
            else&lt;br /&gt;
                return frac&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Leading integer from a value; supports string or number; nil if none.&lt;br /&gt;
local function numlead(v)&lt;br /&gt;
    if v == nil then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    if type(v) == &amp;quot;number&amp;quot; then&lt;br /&gt;
        return v&lt;br /&gt;
    end&lt;br /&gt;
    local s = tostring(v)&lt;br /&gt;
    if s == &amp;quot;&amp;quot; then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 1) strip leading spaces and wiki bold/italic quotes (&#039;&#039; or &#039;&#039;&#039;)&lt;br /&gt;
    s = s:match(&amp;quot;^%s*&#039;*%s*(.*)&amp;quot;) or s&lt;br /&gt;
&lt;br /&gt;
    -- 2) strip *leading* simple wrappers (tags/templates/links), repeatedly, but only if they occur before the first digit.&lt;br /&gt;
    local advanced = true -- set false if you want the minimal version&lt;br /&gt;
    if advanced then&lt;br /&gt;
        local changed = true&lt;br /&gt;
        while changed do&lt;br /&gt;
            changed = false&lt;br /&gt;
            local s2 = s:gsub(&amp;quot;^%s*&amp;lt;[^&amp;gt;]-&amp;gt;%s*&amp;quot;, &amp;quot;&amp;quot;, 1) -- leading HTML tag&lt;br /&gt;
            if s2 ~= s then&lt;br /&gt;
                s, changed = s2, true&lt;br /&gt;
            end&lt;br /&gt;
            s2 = s:gsub(&amp;quot;^%s*{{.-}}%s*&amp;quot;, &amp;quot;&amp;quot;, 1) -- leading template&lt;br /&gt;
            if s2 ~= s then&lt;br /&gt;
                s, changed = s2, true&lt;br /&gt;
            end&lt;br /&gt;
            s2 = s:gsub(&amp;quot;^%s*%[%[[^%]]-%]%]%s*&amp;quot;, &amp;quot;&amp;quot;, 1) -- leading wikilink&lt;br /&gt;
            if s2 ~= s then&lt;br /&gt;
                s, changed = s2, true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 3) capture leading digits only (stops at first non-digit)&lt;br /&gt;
    s = normalizeFractions(s)&lt;br /&gt;
    local n = s:match(&amp;quot;^(%d+%.?%d*)&amp;quot;)&lt;br /&gt;
    return n and tonumber(n) or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===========================&lt;br /&gt;
-- 4) MATCH GROUPING (PER RD)&lt;br /&gt;
-- ===========================&lt;br /&gt;
local function _matchGroups()&lt;br /&gt;
    state.matchgroup = state.matchgroup or {}&lt;br /&gt;
    local MINC, C, R = config.minc, config.c, config.r&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        local mgj = {}&lt;br /&gt;
        state.matchgroup[j] = mgj&lt;br /&gt;
&lt;br /&gt;
        local tpm = tonumber(state.teamsPerMatch[j]) or 2&lt;br /&gt;
        if tpm &amp;lt; 1 then&lt;br /&gt;
            tpm = 2&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local col = state.entries[j]&lt;br /&gt;
        if col then&lt;br /&gt;
            for i = 1, R do&lt;br /&gt;
                local e = col[i]&lt;br /&gt;
                if e and e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                    local idx = tonumber(e.index) or tonumber(e.altindex) or i&lt;br /&gt;
                    local g = m_ceil(idx / tpm)&lt;br /&gt;
                    mgj[i] = g&lt;br /&gt;
                    e.group = g&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Build ordered lists once per round: gid -&amp;gt; {row indices}&lt;br /&gt;
local function buildGroupsForRound(j, R)&lt;br /&gt;
    local groups = {}&lt;br /&gt;
    local mg = (state.matchgroup and state.matchgroup[j]) or {}&lt;br /&gt;
    local col = state.entries[j]&lt;br /&gt;
    if not col then&lt;br /&gt;
        return groups&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i = 1, R do&lt;br /&gt;
        local e = col[i]&lt;br /&gt;
        if e and e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
            local gid = mg[i]&lt;br /&gt;
            if gid ~= nil then&lt;br /&gt;
                local t = groups[gid]&lt;br /&gt;
                if not t then&lt;br /&gt;
                    t = {}&lt;br /&gt;
                    groups[gid] = t&lt;br /&gt;
                end&lt;br /&gt;
                t[#t + 1] = i&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return groups&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Pre-parse leg numbers for each team (per round), only when agg &amp;amp; &amp;gt;1 legs.&lt;br /&gt;
-- Returns: i -&amp;gt; { [l] = number|nil }&lt;br /&gt;
local function preparseLegs(j, R)&lt;br /&gt;
    local legNums = {}&lt;br /&gt;
    local col = state.entries[j]&lt;br /&gt;
    if not col then&lt;br /&gt;
        return legNums&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i = 1, R do&lt;br /&gt;
        local e = col[i]&lt;br /&gt;
        if e and e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
            local L = teamLegs(j, i)&lt;br /&gt;
            if config.aggregate and L &amp;gt; 1 and e.score then&lt;br /&gt;
                local t = {}&lt;br /&gt;
                for l = 1, L do&lt;br /&gt;
                    t[l] = numlead(e.score[l])&lt;br /&gt;
                end&lt;br /&gt;
                legNums[i] = t&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return legNums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==========================================&lt;br /&gt;
-- 5) COMPUTE AGGREGATES (score/legs/sets)&lt;br /&gt;
-- ==========================================&lt;br /&gt;
local function _computeAggregate()&lt;br /&gt;
    if config.aggregate_mode == &amp;quot;off&amp;quot; or config.aggregate_mode == &amp;quot;manual&amp;quot; then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local MINC, C, R = config.minc, config.c, config.r&lt;br /&gt;
    local modeLow = (config.boldwinner_mode == &amp;quot;low&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        local groups = buildGroupsForRound(j, R)&lt;br /&gt;
        local legNums = preparseLegs(j, R)&lt;br /&gt;
&lt;br /&gt;
        if config.aggregate_mode == &amp;quot;score&amp;quot; then&lt;br /&gt;
            -- Sum per-leg scores; operate directly on parsed legNums.&lt;br /&gt;
            for i, nums in pairs(legNums) do&lt;br /&gt;
                local e = state.entries[j][i]&lt;br /&gt;
                if e and e.ctype == &amp;quot;team&amp;quot; and config.aggregate and teamLegs(j, i) &amp;gt; 1 then&lt;br /&gt;
                    local sc = e.score&lt;br /&gt;
                    if sc and isempty(sc.agg) then&lt;br /&gt;
                        local sum = 0&lt;br /&gt;
                        for _, v in ipairs(nums) do&lt;br /&gt;
                            if v then&lt;br /&gt;
                                sum = sum + v&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                        sc.agg = tostring(sum)&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            -- &#039;sets&#039;/&#039;legs&#039;: count wins per-leg using high/low rule; ties yield no win.&lt;br /&gt;
            for _, members in pairs(groups) do&lt;br /&gt;
                local wins = {} -- row index -&amp;gt; wins&lt;br /&gt;
&lt;br /&gt;
                -- Comparable leg count across the group = min(#numeric arrays)&lt;br /&gt;
                local commonLegs = math.huge&lt;br /&gt;
                for _, i in ipairs(members) do&lt;br /&gt;
                    local nums = legNums[i]&lt;br /&gt;
                    local L = (nums and #nums) or 0&lt;br /&gt;
                    if L == 0 then&lt;br /&gt;
                        commonLegs = 0&lt;br /&gt;
                        break&lt;br /&gt;
                    end&lt;br /&gt;
                    if L &amp;lt; commonLegs then&lt;br /&gt;
                        commonLegs = L&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                for l = 1, commonLegs do&lt;br /&gt;
                    local allNumeric = true&lt;br /&gt;
                    for _, i in ipairs(members) do&lt;br /&gt;
                        local v = legNums[i] and legNums[i][l]&lt;br /&gt;
                        if v == nil then&lt;br /&gt;
                            allNumeric = false&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                    if allNumeric then&lt;br /&gt;
                        local best, bestIdx, tie&lt;br /&gt;
                        for _, i in ipairs(members) do&lt;br /&gt;
                            local v = legNums[i][l]&lt;br /&gt;
                            if best == nil then&lt;br /&gt;
                                best, bestIdx, tie = v, i, false&lt;br /&gt;
                            else&lt;br /&gt;
                                if (modeLow and v &amp;lt; best) or (not modeLow and v &amp;gt; best) then&lt;br /&gt;
                                    best, bestIdx, tie = v, i, false&lt;br /&gt;
                                elseif v == best then&lt;br /&gt;
                                    tie = true&lt;br /&gt;
                                end&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                        if not tie and bestIdx then&lt;br /&gt;
                            wins[bestIdx] = (wins[bestIdx] or 0) + 1&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                -- Write aggregates if still empty&lt;br /&gt;
                for _, i in ipairs(members) do&lt;br /&gt;
                    local e = state.entries[j][i]&lt;br /&gt;
                    if e and e.ctype == &amp;quot;team&amp;quot; and config.aggregate and teamLegs(j, i) &amp;gt; 1 then&lt;br /&gt;
                        local sc = e.score&lt;br /&gt;
                        if sc and isempty(sc.agg) then&lt;br /&gt;
                            sc.agg = tostring(wins[i] or 0)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==========================================&lt;br /&gt;
-- 6) BOLD WINNERS (per cells &amp;amp; whole rows)&lt;br /&gt;
-- ==========================================&lt;br /&gt;
local function _boldWinner()&lt;br /&gt;
    local function isWin(mine, theirs)&lt;br /&gt;
        return modeLow and (mine &amp;lt; theirs) or (not modeLow and mine &amp;gt; theirs)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function isAggWin(mine, theirs, colKey)&lt;br /&gt;
        -- For aggregate counts (legs/sets won), higher is always better&lt;br /&gt;
        if colKey == &amp;quot;agg&amp;quot; and (config.aggregate_mode ~= &amp;quot;score&amp;quot;) then&lt;br /&gt;
            return mine &amp;gt; theirs&lt;br /&gt;
        end&lt;br /&gt;
        return isWin(mine, theirs)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not config or config.boldwinner_mode == &amp;quot;off&amp;quot; then&lt;br /&gt;
        -- Normalize all weights (defensive; avoids leftovers across calls)&lt;br /&gt;
        for j = config.minc, config.c do&lt;br /&gt;
            for i = 1, config.r do&lt;br /&gt;
                local e = state.entries[j] and state.entries[j][i]&lt;br /&gt;
                if e and e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                    e.weight = &amp;quot;normal&amp;quot;&lt;br /&gt;
                    if e.score and e.score.weight then&lt;br /&gt;
                        for k, _ in pairs(e.score.weight) do&lt;br /&gt;
                            e.score.weight[k] = &amp;quot;normal&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local MINC, C, R = config.minc, config.c, config.r&lt;br /&gt;
    local modeLow = (config.boldwinner_mode == &amp;quot;low&amp;quot;)&lt;br /&gt;
    local aggOnly = config.boldwinner_aggonly&lt;br /&gt;
&lt;br /&gt;
    local function isWin(mine, theirs)&lt;br /&gt;
        return modeLow and (mine &amp;lt; theirs) or (not modeLow and mine &amp;gt; theirs)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function isAggWin(mine, theirs, colKey)&lt;br /&gt;
        if colKey == &amp;quot;agg&amp;quot; and config.aggregate_mode == &amp;quot;sets&amp;quot; then&lt;br /&gt;
            -- Sets/legs won: larger count wins regardless of low/high sport&lt;br /&gt;
            return mine &amp;gt; theirs&lt;br /&gt;
        end&lt;br /&gt;
        return isWin(mine, theirs)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function hasAllScores(e, legs)&lt;br /&gt;
        local sc = e.score&lt;br /&gt;
        for l = 1, legs do&lt;br /&gt;
            local sv = sc and sc[l]&lt;br /&gt;
            if isempty(sv) or s_find(sv or &amp;quot;&amp;quot;, &amp;quot;nbsp&amp;quot;) then -- use alias&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        local groups = buildGroupsForRound(j, R)&lt;br /&gt;
&lt;br /&gt;
        -- Reset counters &amp;amp; ensure score/weight tables exist&lt;br /&gt;
        for i = 1, R do&lt;br /&gt;
            local e = state.entries[j] and state.entries[j][i]&lt;br /&gt;
            if e and e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                e.wins, e.aggwins = 0, 0&lt;br /&gt;
                e.score = e.score or {}&lt;br /&gt;
                e.score.weight = e.score.weight or {}&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        for _, members in pairs(groups) do&lt;br /&gt;
            -- Parse per-leg and aggregate numbers ONCE for this group (works for 1+ legs)&lt;br /&gt;
            local perLegNum = {} -- row -&amp;gt; { l -&amp;gt; number|nil }&lt;br /&gt;
            local aggNum = {} -- row -&amp;gt; number|nil&lt;br /&gt;
&lt;br /&gt;
            for _, i in ipairs(members) do&lt;br /&gt;
                local e = state.entries[j][i]&lt;br /&gt;
                local legs = teamLegs(j, i)&lt;br /&gt;
                local arr = {}&lt;br /&gt;
                for l = 1, legs do&lt;br /&gt;
                    arr[l] = numlead(e.score and e.score[l])&lt;br /&gt;
                end&lt;br /&gt;
                perLegNum[i] = arr&lt;br /&gt;
                aggNum[i] = numlead(e.score and e.score.agg)&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Per-score bolding (skip entirely if agg-only)&lt;br /&gt;
            if not aggOnly then&lt;br /&gt;
                -- iterate to the max leg count in the group&lt;br /&gt;
                local maxL = 0&lt;br /&gt;
                for _, i in ipairs(members) do&lt;br /&gt;
                    local L = teamLegs(j, i)&lt;br /&gt;
                    if L &amp;gt; maxL then&lt;br /&gt;
                        maxL = L&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                for l = 1, maxL do&lt;br /&gt;
                    local allNumeric = true&lt;br /&gt;
                    local best, bestIdx, tie&lt;br /&gt;
                    for _, i in ipairs(members) do&lt;br /&gt;
                        local v = perLegNum[i] and perLegNum[i][l]&lt;br /&gt;
                        if v == nil then&lt;br /&gt;
                            allNumeric = false&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                        if best == nil then&lt;br /&gt;
                            best, bestIdx, tie = v, i, false&lt;br /&gt;
                        else&lt;br /&gt;
                            if (modeLow and v &amp;lt; best) or (not modeLow and v &amp;gt; best) then&lt;br /&gt;
                                best, bestIdx, tie = v, i, false&lt;br /&gt;
                            elseif v == best then&lt;br /&gt;
                                tie = true&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    if allNumeric and not tie and bestIdx then&lt;br /&gt;
                        -- set the winner bold + increment wins&lt;br /&gt;
                        local e = state.entries[j][bestIdx]&lt;br /&gt;
                        e.score.weight[l] = &amp;quot;bold&amp;quot;&lt;br /&gt;
                        e.wins = (e.wins or 0) + 1&lt;br /&gt;
                        -- normalize others on this leg&lt;br /&gt;
                        for _, i in ipairs(members) do&lt;br /&gt;
                            if i ~= bestIdx then&lt;br /&gt;
                                state.entries[j][i].score.weight[l] = &amp;quot;normal&amp;quot;&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        -- no unique winner: normalize everyone for this leg&lt;br /&gt;
                        for _, i in ipairs(members) do&lt;br /&gt;
                            state.entries[j][i].score.weight[l] = &amp;quot;normal&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Aggregate column (if configured &amp;amp; multi-leg)&lt;br /&gt;
            do&lt;br /&gt;
                local needAgg = false&lt;br /&gt;
                for _, i in ipairs(members) do&lt;br /&gt;
                    if config.aggregate and teamLegs(j, i) &amp;gt; 1 then&lt;br /&gt;
                        needAgg = true&lt;br /&gt;
                        break&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if needAgg then&lt;br /&gt;
                    local allNumeric = true&lt;br /&gt;
                    local best, bestIdx, tie&lt;br /&gt;
&lt;br /&gt;
                    -- comparator: for legs/sets counts, higher always wins&lt;br /&gt;
                    local function betterAgg(a, b)&lt;br /&gt;
                        if config.aggregate_mode ~= &amp;quot;score&amp;quot; then&lt;br /&gt;
                            return a &amp;gt; b&lt;br /&gt;
                        else&lt;br /&gt;
                            return (modeLow and a &amp;lt; b) or (not modeLow and a &amp;gt; b)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    for _, i in ipairs(members) do&lt;br /&gt;
                        local v = aggNum[i]&lt;br /&gt;
                        if v == nil then&lt;br /&gt;
                            allNumeric = false&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                        if best == nil then&lt;br /&gt;
                            best, bestIdx, tie = v, i, false&lt;br /&gt;
                        else&lt;br /&gt;
                            if betterAgg(v, best) then&lt;br /&gt;
                                best, bestIdx, tie = v, i, false&lt;br /&gt;
                            elseif v == best then&lt;br /&gt;
                                tie = true&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    if allNumeric and not tie and bestIdx then&lt;br /&gt;
                        local e = state.entries[j][bestIdx]&lt;br /&gt;
                        e.score.weight.agg = &amp;quot;bold&amp;quot;&lt;br /&gt;
                        e.aggwins = 1&lt;br /&gt;
                        for _, i in ipairs(members) do&lt;br /&gt;
                            if i ~= bestIdx then&lt;br /&gt;
                                local o = state.entries[j][i]&lt;br /&gt;
                                o.score.weight.agg = &amp;quot;normal&amp;quot;&lt;br /&gt;
                                o.aggwins = 0&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        for _, i in ipairs(members) do&lt;br /&gt;
                            local e = state.entries[j][i]&lt;br /&gt;
                            if e.score then&lt;br /&gt;
                                e.score.weight.agg = &amp;quot;normal&amp;quot;&lt;br /&gt;
                            end&lt;br /&gt;
                            e.aggwins = 0&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Whole-team bolding (skip if agg-only so only agg cell bolds)&lt;br /&gt;
            if not aggOnly then&lt;br /&gt;
                for _, i in ipairs(members) do&lt;br /&gt;
                    local e = state.entries[j][i]&lt;br /&gt;
                    local legs = teamLegs(j, i)&lt;br /&gt;
                    local useAggregate = config.aggregate and legs &amp;gt; 1&lt;br /&gt;
                    local winsKey = useAggregate and &amp;quot;aggwins&amp;quot; or &amp;quot;wins&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                    if not useAggregate then&lt;br /&gt;
                        if (e[winsKey] or 0) &amp;gt; legs / 2 then&lt;br /&gt;
                            e.weight = &amp;quot;bold&amp;quot;&lt;br /&gt;
                        else&lt;br /&gt;
                            e.weight = hasAllScores(e, legs) and &amp;quot;bold&amp;quot; or &amp;quot;normal&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    -- Must strictly beat any opponent on winsKey&lt;br /&gt;
                    for _, oi in ipairs(members) do&lt;br /&gt;
                        if oi ~= i then&lt;br /&gt;
                            local opp = state.entries[j][oi]&lt;br /&gt;
                            if (e[winsKey] or 0) &amp;lt;= tonumber(opp[winsKey] or 0) then&lt;br /&gt;
                                e.weight = &amp;quot;normal&amp;quot;&lt;br /&gt;
                                break&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    if useAggregate then&lt;br /&gt;
                        -- when using aggregate, team weight follows aggwins comparison&lt;br /&gt;
                        e.weight = ((e[winsKey] or 0) &amp;gt; 0) and &amp;quot;bold&amp;quot; or &amp;quot;normal&amp;quot;&lt;br /&gt;
                        for _, oi in ipairs(members) do&lt;br /&gt;
                            if oi ~= i then&lt;br /&gt;
                                local opp = state.entries[j][oi]&lt;br /&gt;
                                if (e[winsKey] or 0) &amp;lt;= tonumber(opp[winsKey] or 0) then&lt;br /&gt;
                                    e.weight = &amp;quot;normal&amp;quot;&lt;br /&gt;
                                    break&lt;br /&gt;
                                end&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============================&lt;br /&gt;
-- 7) UPDATE PER-ROUND MAX LEGS&lt;br /&gt;
-- ==============================&lt;br /&gt;
local function _updateMaxLegs()&lt;br /&gt;
    local MINC, C, R = config.minc, config.c, config.r&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        local col = state.entries[j]&lt;br /&gt;
        local rj = state.rlegs[j]&lt;br /&gt;
        local mj = rj&lt;br /&gt;
        if col then&lt;br /&gt;
            for i = 1, R do&lt;br /&gt;
                local e = col[i]&lt;br /&gt;
                if e then&lt;br /&gt;
                    if notempty(e.legs) then&lt;br /&gt;
                        mj = m_max(rj, e.legs)&lt;br /&gt;
                    end&lt;br /&gt;
                    if config.autolegs and e.score then&lt;br /&gt;
                        local l = 1&lt;br /&gt;
                        while e.score[l] and not isempty(e.score[l]) do&lt;br /&gt;
                            l = l + 1&lt;br /&gt;
                        end&lt;br /&gt;
                        mj = m_max(mj, l - 1)&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        state.maxlegs[j] = mj&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============&lt;br /&gt;
-- 8) PUBLIC API&lt;br /&gt;
-- ==============&lt;br /&gt;
function Logic.matchGroups(_state, _config)&lt;br /&gt;
    bind(_state, _config)&lt;br /&gt;
    _matchGroups()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Logic.computeAggregate(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    _computeAggregate()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Logic.boldWinner(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    _boldWinner()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Logic.updateMaxLegs(_state, _config, _Helpers)&lt;br /&gt;
    bind(_state, _config, _Helpers)&lt;br /&gt;
    _updateMaxLegs()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Logic&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Paths&amp;diff=76412</id>
		<title>Module:Build bracket/Paths</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Paths&amp;diff=76412"/>
		<updated>2026-07-24T10:50:38Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Paths = {}&lt;br /&gt;
&lt;br /&gt;
-- ==============================&lt;br /&gt;
-- 1) MODULE STATE &amp;amp; HOT HELPERS&lt;br /&gt;
-- ==============================&lt;br /&gt;
local _pathsCache = {} -- memo for parsePaths during one build&lt;br /&gt;
local t_insert = table.insert -- stdlib alias&lt;br /&gt;
local mmin, mmax = math.min, math.max&lt;br /&gt;
&lt;br /&gt;
-- upvalues bound per call (set in bind)&lt;br /&gt;
local state, config, Helpers, StateChecks&lt;br /&gt;
local split, notempty, bargs, getFArg, isBlankEntry&lt;br /&gt;
local defaultColor&lt;br /&gt;
&lt;br /&gt;
local showByeOn = true -- toggle for bye through-lines&lt;br /&gt;
local base = 0 -- left-round base offset&lt;br /&gt;
&lt;br /&gt;
-- cache for per-round “RDx-RDy-path” OFF flags&lt;br /&gt;
local rdGateOff = {}&lt;br /&gt;
&lt;br /&gt;
-- thickness constants: renderer maps 1.0 =&amp;gt; 2px, 0.5 =&amp;gt; 1px&lt;br /&gt;
local STRONG = 1.0&lt;br /&gt;
local FEATHER = 0.5&lt;br /&gt;
&lt;br /&gt;
-- Small helpers&lt;br /&gt;
local function tpmOf(col) -- teams per match for a given team column&lt;br /&gt;
    return (state.teamsPerMatch and state.teamsPerMatch[col]) or 2&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function entries(col) -- convenience accessor&lt;br /&gt;
    return state.entries and state.entries[col]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function clearPathsCache() -- reset parse cache each build&lt;br /&gt;
    _pathsCache = {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function origJ(j) -- external round index from internal j&lt;br /&gt;
    return j + base&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===================&lt;br /&gt;
-- 2) ROW/COLUMN MATH&lt;br /&gt;
-- ===================&lt;br /&gt;
local function rowOf(j, m)&lt;br /&gt;
    local sj = (state.shift and state.shift[j]) or 0&lt;br /&gt;
    local tpm = tpmOf(j)&lt;br /&gt;
    -- map match index m to internal row for team slot center&lt;br /&gt;
    return 2 * (m + sj) + (tpm - 2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============================&lt;br /&gt;
-- 3) BIND + ARG/CONFIG WIRING&lt;br /&gt;
-- ============================&lt;br /&gt;
local function bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    state, config, Helpers, StateChecks = _state, _config, _Helpers, _StateChecks&lt;br /&gt;
    split, notempty, bargs, getFArg = _Helpers.split, _Helpers.notempty, _Helpers.bargs, _Helpers.getFArg&lt;br /&gt;
    isBlankEntry = _StateChecks.isBlankEntry&lt;br /&gt;
&lt;br /&gt;
    defaultColor = (config.COLORS and config.COLORS.path_line_color) or &amp;quot;gray&amp;quot;&lt;br /&gt;
    base = config.base or 0&lt;br /&gt;
&lt;br /&gt;
    -- cache bye toggle once&lt;br /&gt;
    local v = (_Helpers.bargs and _Helpers.bargs(&amp;quot;show-bye-paths&amp;quot;)) or &amp;quot;&amp;quot;&lt;br /&gt;
    showByeOn = not Helpers.no(v)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Precompute RD gate flags once per build (RDx-RDy-path = &amp;quot;no&amp;quot; means gate ON =&amp;gt; block)&lt;br /&gt;
local function computeRoundGates()&lt;br /&gt;
    rdGateOff = {}&lt;br /&gt;
    for j = config.minc, config.c - 1 do&lt;br /&gt;
        local rd = (bargs((&amp;quot;RD%d-RD%d-path&amp;quot;):format(origJ(j), origJ(j) + 1)) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        rdGateOff[j] = Helpers.no(rd)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================&lt;br /&gt;
-- 4) PATH PARSING + CACHE&lt;br /&gt;
-- ========================&lt;br /&gt;
local function parsePaths(j)&lt;br /&gt;
    local cached = _pathsCache[j]&lt;br /&gt;
    if cached then&lt;br /&gt;
        return cached&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local oj = origJ(j)&lt;br /&gt;
    local str = (getFArg(&amp;quot;col&amp;quot; .. oj .. &amp;quot;-col&amp;quot; .. (oj + 1) .. &amp;quot;-paths&amp;quot;) or &amp;quot;&amp;quot;):gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    local result = {}&lt;br /&gt;
&lt;br /&gt;
    -- grammar: (a,b- c:d, e:f - color1,color2,...) etc.&lt;br /&gt;
    for val in str:gsub(&amp;quot;,&amp;quot;, &amp;quot;, &amp;quot;):gsub(&amp;quot;%S+&amp;quot;, &amp;quot;\0%0\0&amp;quot;):gsub(&lt;br /&gt;
        &amp;quot;%b()&amp;quot;,&lt;br /&gt;
        function(s)&lt;br /&gt;
            return s:gsub(&amp;quot;%z&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    ):gmatch(&amp;quot;%z(.-)%z&amp;quot;) do&lt;br /&gt;
        -- strip parens once, split once&lt;br /&gt;
        local array = split(val:gsub(&amp;quot;[()]&amp;quot;, &amp;quot;&amp;quot;), {&amp;quot;-&amp;quot;})&lt;br /&gt;
        for k, _ in ipairs(array) do&lt;br /&gt;
            array[k] = split(array[k], {&amp;quot;,&amp;quot;})&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if notempty(array[2]) then&lt;br /&gt;
            array[3] = array[3] or {}&lt;br /&gt;
            for m = 1, #array[2] do&lt;br /&gt;
                local pair = split(array[2][m], {&amp;quot;:&amp;quot;})&lt;br /&gt;
                array[2][m] = pair[1]&lt;br /&gt;
                array[3][m] = pair[2]&lt;br /&gt;
            end&lt;br /&gt;
            for n = 1, #array[1] do&lt;br /&gt;
                local a = tonumber(array[1][n])&lt;br /&gt;
                for m = 1, #array[2] do&lt;br /&gt;
                    t_insert(result, {a, tonumber(array[2][m]), color = array[3][m]})&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    _pathsCache[j] = result&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============================&lt;br /&gt;
-- 5) STRUCTURAL READS &amp;amp; WINDOWS&lt;br /&gt;
-- ==============================&lt;br /&gt;
-- Through-line mask that already exists in a team column (from a previous step)&lt;br /&gt;
local function throughEdgesMaskAt(teamCol, sRow)&lt;br /&gt;
    local e = entries(teamCol)&lt;br /&gt;
    if not e then&lt;br /&gt;
        return false, false&lt;br /&gt;
    end&lt;br /&gt;
    local hasBottom =&lt;br /&gt;
        (sRow - 1 &amp;gt;= 1) and e[sRow - 1] and e[sRow - 1].ctype == &amp;quot;line&amp;quot; and&lt;br /&gt;
        (e[sRow - 1].border == &amp;quot;bottom&amp;quot; or e[sRow - 1].border == &amp;quot;both&amp;quot;)&lt;br /&gt;
    local hasTop =&lt;br /&gt;
        (sRow + 1 &amp;lt;= config.r) and e[sRow + 1] and e[sRow + 1].ctype == &amp;quot;line&amp;quot; and&lt;br /&gt;
        (e[sRow + 1].border == &amp;quot;top&amp;quot; or e[sRow + 1].border == &amp;quot;both&amp;quot;)&lt;br /&gt;
    return hasBottom, hasTop&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- window = the block of rows that constitutes a match near sRow&lt;br /&gt;
local function matchWindow(col, sRow)&lt;br /&gt;
    local tpm = tpmOf(col)&lt;br /&gt;
    local half = 2 * (tpm - 1) -- distance to top/bottom team rows&lt;br /&gt;
    local lo = mmax(1, sRow - half)&lt;br /&gt;
    local hi = mmin(config.r, sRow + half)&lt;br /&gt;
    return lo, hi, tpm&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Single-pass scan: returns hasTeam, headerIndex (or nil), allTeamsBlank&lt;br /&gt;
local function scanWindow(col, sRow)&lt;br /&gt;
    local ent = entries(col)&lt;br /&gt;
    if not ent then&lt;br /&gt;
        return false, nil, true&lt;br /&gt;
    end&lt;br /&gt;
    local lo, hi = matchWindow(col, sRow)&lt;br /&gt;
    local hidx, hasTeam = nil, false&lt;br /&gt;
    local allBlank = true&lt;br /&gt;
    for r = lo, hi do&lt;br /&gt;
        local e = ent[r]&lt;br /&gt;
        if e then&lt;br /&gt;
            if not hidx and e.headerindex then&lt;br /&gt;
                hidx = e.headerindex&lt;br /&gt;
            end&lt;br /&gt;
            if e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                hasTeam = true&lt;br /&gt;
                if allBlank and not isBlankEntry(col, r) then&lt;br /&gt;
                    allBlank = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return hasTeam, hidx, allBlank&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =================================&lt;br /&gt;
-- 6) SLOT DISPOSITION / VISIBILITY&lt;br /&gt;
-- =================================&lt;br /&gt;
local slotDisp  -- j -&amp;gt; sRow -&amp;gt; &#039;visible&#039; | &#039;through&#039; | &#039;suppress&#039;&lt;br /&gt;
&lt;br /&gt;
local function computeSlotDispositions()&lt;br /&gt;
    slotDisp = {}&lt;br /&gt;
    local minc, c = config.minc, config.c&lt;br /&gt;
    local R = mmax(1, (config.r or 1) - 1)&lt;br /&gt;
&lt;br /&gt;
    for j = minc, c do&lt;br /&gt;
        local sdj = {}&lt;br /&gt;
        slotDisp[j] = sdj&lt;br /&gt;
        for sRow = 1, R do&lt;br /&gt;
            local hasTeam, hidx, allBlank = scanWindow(j, sRow)&lt;br /&gt;
&lt;br /&gt;
            if not hasTeam then&lt;br /&gt;
                sdj[sRow] = (j &amp;gt; minc and j &amp;lt; c) and &amp;quot;through&amp;quot; or &amp;quot;suppress&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                local disp = &amp;quot;visible&amp;quot;&lt;br /&gt;
                if hidx then&lt;br /&gt;
                    local hid = state.hide and state.hide[j] and state.hide[j][hidx]&lt;br /&gt;
                    local byes = state.byes and state.byes[j] and state.byes[j][hidx]&lt;br /&gt;
                    if hid then&lt;br /&gt;
                        disp = &amp;quot;suppress&amp;quot;&lt;br /&gt;
                    elseif byes and allBlank then&lt;br /&gt;
                        disp = (showByeOn and j &amp;gt; minc and j &amp;lt; c) and &amp;quot;through&amp;quot; or &amp;quot;suppress&amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                sdj[sRow] = disp&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function dispositionOf(j, sRow) -- on-demand fallback&lt;br /&gt;
    local sdj = slotDisp and slotDisp[j]&lt;br /&gt;
    if sdj and sdj[sRow] then&lt;br /&gt;
        return sdj[sRow]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local _, hidx, allBlank = scanWindow(j, sRow)&lt;br /&gt;
    if not hidx then&lt;br /&gt;
        return &amp;quot;visible&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local hid = state.hide and state.hide[j] and state.hide[j][hidx]&lt;br /&gt;
    local byes = state.byes and state.byes[j] and state.byes[j][hidx]&lt;br /&gt;
    if hid then&lt;br /&gt;
        return &amp;quot;suppress&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if byes and allBlank then&lt;br /&gt;
        if not showByeOn then&lt;br /&gt;
            return &amp;quot;suppress&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if j &amp;gt; config.minc and j &amp;lt; config.c then&lt;br /&gt;
            return &amp;quot;through&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        return &amp;quot;suppress&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;visible&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function slotIsVisiblyReal(col, sRow)&lt;br /&gt;
    local hasTeam, hidx, allBlank = scanWindow(col, sRow)&lt;br /&gt;
    if not hasTeam then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    if hidx then&lt;br /&gt;
        local hid = state.hide and state.hide[col] and state.hide[col][hidx]&lt;br /&gt;
        local byes = state.byes and state.byes[col] and state.byes[col][hidx]&lt;br /&gt;
        if hid then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
        if byes and (not showByeOn) and allBlank then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isThroughableTeamSlot(teamCol, sRow)&lt;br /&gt;
    return dispositionOf(teamCol, sRow) == &amp;quot;through&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =======================================&lt;br /&gt;
-- 7) RENDER PRIMITIVES (low-level utils)&lt;br /&gt;
-- =======================================&lt;br /&gt;
-- === Tiny cell primitives (keep paintVertical as-is) ===&lt;br /&gt;
local function ensurePathCell(j, i, k)&lt;br /&gt;
    state.pathCell[j] = state.pathCell[j] or {}&lt;br /&gt;
    state.pathCell[j][i] = state.pathCell[j][i] or {}&lt;br /&gt;
    local cell = state.pathCell[j][i][k]&lt;br /&gt;
    if not cell then&lt;br /&gt;
        cell = {{0, 0, 0, 0}, color = defaultColor}&lt;br /&gt;
        state.pathCell[j][i][k] = cell&lt;br /&gt;
    end&lt;br /&gt;
    return cell&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Ensure all arrays for column j exist and are sized to R rows&lt;br /&gt;
local function ensureColumnScaffolding(j)&lt;br /&gt;
    local R = assert(config.r, &amp;quot;config.r must be set before scaffolding&amp;quot;)&lt;br /&gt;
    state.pathCell[j] = state.pathCell[j] or {}&lt;br /&gt;
    state.crossCell[j] = state.crossCell[j] or {}&lt;br /&gt;
    state.skipPath[j] = state.skipPath[j] or {}&lt;br /&gt;
&lt;br /&gt;
    for i = 1, R do&lt;br /&gt;
        -- make sure the 3 path lanes exist&lt;br /&gt;
        ensurePathCell(j, i, 1)&lt;br /&gt;
        ensurePathCell(j, i, 2)&lt;br /&gt;
        ensurePathCell(j, i, 3)&lt;br /&gt;
&lt;br /&gt;
        -- default cross info&lt;br /&gt;
        state.crossCell[j][i] = state.crossCell[j][i] or {left = {0, defaultColor}, right = {0, defaultColor}}&lt;br /&gt;
&lt;br /&gt;
        -- skipPath defaults to boolean&lt;br /&gt;
        if state.skipPath[j][i] == nil then&lt;br /&gt;
            state.skipPath[j][i] = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function paintEdge(j, i, k, edge, val, color)&lt;br /&gt;
    local cell = ensurePathCell(j, i, k)&lt;br /&gt;
    local b = cell[1]&lt;br /&gt;
    if val &amp;gt; (b[edge] or 0) then&lt;br /&gt;
        b[edge] = val&lt;br /&gt;
    end&lt;br /&gt;
    if color then&lt;br /&gt;
        cell.color = color&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- === One generic &amp;quot;pair painter&amp;quot;  ===&lt;br /&gt;
-- kind: &#039;L&#039; (left path col = k=1), &#039;C&#039; (center = k=2), &#039;R&#039; (right = k=3)&lt;br /&gt;
-- side: &#039;upper&#039; | &#039;lower&#039;&lt;br /&gt;
-- feather: true =&amp;gt; opposite side FEATHER; false =&amp;gt; opposite side omitted (no feather)&lt;br /&gt;
local K = {L = 1, C = 2, R = 3}&lt;br /&gt;
local TOP, BOT = 1, 3&lt;br /&gt;
local function paintPair(kind, side, feather, j, row, color)&lt;br /&gt;
    local k = K[kind]&lt;br /&gt;
    local R = config.r&lt;br /&gt;
    local strongAt, weakAt = (side == &amp;quot;upper&amp;quot;) and BOT or TOP, (side == &amp;quot;upper&amp;quot;) and TOP or BOT&lt;br /&gt;
    -- strong on owned side&lt;br /&gt;
    paintEdge(j, row + (side == &amp;quot;lower&amp;quot; and 1 or 0), k, strongAt, STRONG, color)&lt;br /&gt;
    -- optional feather on the other side (skip entirely when feather=false)&lt;br /&gt;
    if feather and row + (side == &amp;quot;upper&amp;quot; and 1 or 0) &amp;lt;= R then&lt;br /&gt;
        paintEdge(j, row + (side == &amp;quot;upper&amp;quot; and 1 or 0), k, weakAt, FEATHER, color)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Tiny wrappers (purely to keep call sites readable/short)&lt;br /&gt;
local function OUT(j, row, side, feather, color)&lt;br /&gt;
    paintPair(&amp;quot;L&amp;quot;, side, feather, j, row, color)&lt;br /&gt;
end&lt;br /&gt;
local function JOIN(j, row, side, feather, color)&lt;br /&gt;
    paintPair(&amp;quot;C&amp;quot;, side, feather, j, row, color)&lt;br /&gt;
end&lt;br /&gt;
local function IN(j, row, side, feather, color)&lt;br /&gt;
    paintPair(&amp;quot;R&amp;quot;, side, feather, j, row, color)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- vertical stroke (use left edge=2)&lt;br /&gt;
local function paintVertical(j, i1, i2, k, color)&lt;br /&gt;
    if not i1 or not i2 then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    local a, b = i1, i2&lt;br /&gt;
    if a &amp;gt; b then&lt;br /&gt;
        a, b = b, a&lt;br /&gt;
    end&lt;br /&gt;
    for r = a, b do&lt;br /&gt;
        paintEdge(j, r, k, 2, STRONG, color)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===============================&lt;br /&gt;
-- 8) CROSSING / COLORING HELPERS&lt;br /&gt;
-- ===============================&lt;br /&gt;
local function getCrossRowsFor(j)&lt;br /&gt;
    local oj = origJ(j)&lt;br /&gt;
    local raw = (getFArg(&amp;quot;col&amp;quot; .. oj .. &amp;quot;-col&amp;quot; .. (oj + 1) .. &amp;quot;-cross&amp;quot;) or &amp;quot;&amp;quot;):gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    if raw == &amp;quot;&amp;quot; then&lt;br /&gt;
        return {}, false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local parts = split(raw, {&amp;quot;,&amp;quot;}, true)&lt;br /&gt;
    local rows = {}&lt;br /&gt;
    if notempty(parts[1]) then&lt;br /&gt;
        for idx = 1, #parts do&lt;br /&gt;
            local m = tonumber(parts[idx])&lt;br /&gt;
            if m then&lt;br /&gt;
                rows[#rows + 1] = rowOf(j, m)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return rows, (#rows &amp;gt; 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function pickCrossBetween(crossRows, startRow, stopRow)&lt;br /&gt;
    if #crossRows == 0 then&lt;br /&gt;
        return 0&lt;br /&gt;
    end&lt;br /&gt;
    local lo, hi = startRow, stopRow&lt;br /&gt;
    if lo &amp;gt; hi then&lt;br /&gt;
        lo, hi = hi, lo&lt;br /&gt;
    end&lt;br /&gt;
    for _, cr in ipairs(crossRows) do&lt;br /&gt;
        if cr &amp;gt; lo and cr &amp;lt; hi then&lt;br /&gt;
            return cr&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function paintVerticalWithCross(j, sRow, eRow, dir, color, crossRows, hasCross, centerUseByStart, inboundDownAt)&lt;br /&gt;
    local goingDown = (dir == &amp;quot;down&amp;quot;)&lt;br /&gt;
    if goingDown then&lt;br /&gt;
        inboundDownAt[eRow] = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function markCU()&lt;br /&gt;
        local cu = centerUseByStart[sRow] or {up = false, down = false}&lt;br /&gt;
        if goingDown then&lt;br /&gt;
            cu.down = true&lt;br /&gt;
        else&lt;br /&gt;
            cu.up = true&lt;br /&gt;
        end&lt;br /&gt;
        centerUseByStart[sRow] = cu&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not hasCross then&lt;br /&gt;
        if goingDown then&lt;br /&gt;
            paintVertical(j, sRow + 1, eRow, 1, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;upper&amp;quot;, false, color)&lt;br /&gt;
        else&lt;br /&gt;
            paintVertical(j, eRow + 1, sRow, 1, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;lower&amp;quot;, false, color)&lt;br /&gt;
        end&lt;br /&gt;
        markCU()&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local cr = pickCrossBetween(crossRows, sRow, eRow)&lt;br /&gt;
    if cr ~= 0 then&lt;br /&gt;
        if goingDown then&lt;br /&gt;
            paintVertical(j, sRow + 1, cr - 1, 1, color)&lt;br /&gt;
            state.crossCell[j][cr].left = {1, color}&lt;br /&gt;
            state.crossCell[j][cr].right = state.crossCell[j][cr].right or {0, color}&lt;br /&gt;
            paintVertical(j, cr + 2, eRow, 2, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;upper&amp;quot;, false, color)&lt;br /&gt;
        else&lt;br /&gt;
            paintVertical(j, eRow + 1, cr - 1, 2, color)&lt;br /&gt;
            state.crossCell[j][cr].right = {1, color}&lt;br /&gt;
            state.crossCell[j][cr].left = state.crossCell[j][cr].left or {0, color}&lt;br /&gt;
            paintVertical(j, cr + 2, sRow, 1, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;lower&amp;quot;, false, color)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        if goingDown then&lt;br /&gt;
            paintVertical(j, sRow + 1, eRow, 2, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;upper&amp;quot;, false, color)&lt;br /&gt;
        else&lt;br /&gt;
            paintVertical(j, eRow + 1, sRow, 2, color)&lt;br /&gt;
            IN(j, eRow, &amp;quot;lower&amp;quot;, false, color)&lt;br /&gt;
        end&lt;br /&gt;
        markCU()&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Detect incoming style (from left path column) per row:&lt;br /&gt;
-- returns: map[row] = { side = &amp;quot;upper&amp;quot;|&amp;quot;lower&amp;quot;, feather = true|false }&lt;br /&gt;
local function detectIncomingStyle(j)&lt;br /&gt;
    local res = {}&lt;br /&gt;
    local left = state.pathCell and state.pathCell[j - 1]&lt;br /&gt;
    if not left then&lt;br /&gt;
        return res&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local R = config.r&lt;br /&gt;
    for i = 1, R - 1 do&lt;br /&gt;
        local cU = left[i] and left[i][3] and left[i][3][1] or {0, 0, 0, 0} -- row i, k=3&lt;br /&gt;
        local cL = left[i + 1] and left[i + 1][3] and left[i + 1][3][1] or {0, 0, 0, 0}&lt;br /&gt;
        -- row i+1, k=3&lt;br /&gt;
&lt;br /&gt;
        local upperStrong = (cU[3] or 0) == STRONG&lt;br /&gt;
        local lowerStrong = (cL[1] or 0) == STRONG&lt;br /&gt;
        local upperFeather = (cL[1] or 0) &amp;gt; 0 and (cL[1] ~= STRONG) -- L feather present?&lt;br /&gt;
        local lowerFeather = (cU[3] or 0) &amp;gt; 0 and (cU[3] ~= STRONG) -- U feather present?&lt;br /&gt;
&lt;br /&gt;
        if upperStrong and not lowerStrong then&lt;br /&gt;
            res[i] = {side = &amp;quot;upper&amp;quot;, feather = upperFeather}&lt;br /&gt;
        elseif lowerStrong and not upperStrong then&lt;br /&gt;
            res[i] = {side = &amp;quot;lower&amp;quot;, feather = lowerFeather}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- If no edge is painted, returns 0, nil&lt;br /&gt;
local function getEdge(col, row, k, edge)&lt;br /&gt;
    local pc = state.pathCell and state.pathCell[col]&lt;br /&gt;
    local cell = pc and pc[row] and pc[row][k]&lt;br /&gt;
    if not cell then&lt;br /&gt;
        return 0, nil&lt;br /&gt;
    end&lt;br /&gt;
    local w = (cell[1] and cell[1][edge]) or 0&lt;br /&gt;
    return w, (w ~= 0) and cell.color or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function finalizeThroughLineColors()&lt;br /&gt;
    for teamCol = config.minc + 1, config.c do&lt;br /&gt;
        local leftPathCol = teamCol - 1&lt;br /&gt;
        local rightPathCol = teamCol&lt;br /&gt;
        local Ent = state.entries[teamCol]&lt;br /&gt;
        if Ent then&lt;br /&gt;
            for sRow = 1, config.r - 1 do&lt;br /&gt;
                local hasBottom, hasTop = throughEdgesMaskAt(teamCol, sRow)&lt;br /&gt;
&lt;br /&gt;
                if hasBottom and Ent[sRow - 1] and Ent[sRow - 1].ctype == &amp;quot;line&amp;quot; then&lt;br /&gt;
                    -- bottom edges at row sRow (left k=3, right k=1) use edge=3&lt;br /&gt;
                    local wL, cL = getEdge(leftPathCol, sRow, 3, 3)&lt;br /&gt;
                    local wR, cR = getEdge(rightPathCol, sRow, 1, 3)&lt;br /&gt;
                    Ent[sRow - 1].color = (wL ~= 0 and wR ~= 0 and cL == cR) and cL or nil&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if hasTop and Ent[sRow + 1] and Ent[sRow + 1].ctype == &amp;quot;line&amp;quot; then&lt;br /&gt;
                    -- top edges at row sRow+1 use edge=1&lt;br /&gt;
                    local wL, cL = getEdge(leftPathCol, sRow + 1, 3, 1)&lt;br /&gt;
                    local wR, cR = getEdge(rightPathCol, sRow + 1, 1, 1)&lt;br /&gt;
                    Ent[sRow + 1].color = (wL ~= 0 and wR ~= 0 and cL == cR) and cL or nil&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 9) PATH VISIBILITY GATES&lt;br /&gt;
-- =========================&lt;br /&gt;
local function hasVisibleOutgoingFrom(j, startRow)&lt;br /&gt;
    if j &amp;gt;= config.c then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    for _, q in ipairs(parsePaths(j) or {}) do&lt;br /&gt;
        local qStartRow = rowOf(j, q[1])&lt;br /&gt;
        if qStartRow == startRow then&lt;br /&gt;
            local qStopRow = rowOf(j + 1, q[2])&lt;br /&gt;
            if dispositionOf(j + 1, qStopRow) ~= &amp;quot;suppress&amp;quot; then&lt;br /&gt;
                return true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function roundGateBlocks(col, startRow)&lt;br /&gt;
    if not rdGateOff[col] then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    local _, hidx = scanWindow(col, startRow)&lt;br /&gt;
    return (hidx == 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasNonSuppressedIncomingTo(j, startRow)&lt;br /&gt;
    if j &amp;lt;= config.minc then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    for _, q in ipairs(parsePaths(j - 1) or {}) do&lt;br /&gt;
        if rowOf(j, q[2]) == startRow then&lt;br /&gt;
            local leftStart = rowOf(j - 1, q[1])&lt;br /&gt;
            if dispositionOf(j - 1, leftStart) ~= &amp;quot;suppress&amp;quot; and not roundGateBlocks(j - 1, leftStart) then&lt;br /&gt;
                return true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isPathHidden(j, start, stop, leftDisp, rightDisp)&lt;br /&gt;
    leftDisp = leftDisp or dispositionOf(j, start)&lt;br /&gt;
    rightDisp = rightDisp or dispositionOf(j + 1, stop)&lt;br /&gt;
&lt;br /&gt;
    if leftDisp == &amp;quot;suppress&amp;quot; or rightDisp == &amp;quot;suppress&amp;quot; then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    do&lt;br /&gt;
        local b, t = throughEdgesMaskAt(j, start)&lt;br /&gt;
        if not (slotIsVisiblyReal(j, start) or b or t) then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    do&lt;br /&gt;
        local b, t = throughEdgesMaskAt(j + 1, stop)&lt;br /&gt;
        if not (slotIsVisiblyReal(j + 1, stop) or isThroughableTeamSlot(j + 1, stop) or b or t) then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if leftDisp == &amp;quot;through&amp;quot; and not hasNonSuppressedIncomingTo(j, start) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    if rightDisp == &amp;quot;through&amp;quot; and not hasVisibleOutgoingFrom(j + 1, stop) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    if rdGateOff[j] then&lt;br /&gt;
        local _, hidx = scanWindow(j, start)&lt;br /&gt;
        if hidx == 1 then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============================&lt;br /&gt;
-- 10) THROUGH-LINES INSERTION&lt;br /&gt;
-- ============================&lt;br /&gt;
local function insertThroughLinesForColumn(j)&lt;br /&gt;
    if not showByeOn then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    local Pj = state.pathCell[j]&lt;br /&gt;
    if not Pj then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    state.entries[j + 1] = state.entries[j + 1] or {}&lt;br /&gt;
    local Ent, R = state.entries[j + 1], config.r&lt;br /&gt;
&lt;br /&gt;
    for i = 1, R - 1 do&lt;br /&gt;
        if isThroughableTeamSlot(j + 1, i) then&lt;br /&gt;
            local c_i3 = Pj[i] and Pj[i][3]&lt;br /&gt;
            local c_ip1_3 = Pj[i + 1] and Pj[i + 1][3]&lt;br /&gt;
            local b_i3 = c_i3 and c_i3[1] or nil&lt;br /&gt;
            local b_ip1_3 = c_ip1_3 and c_ip1_3[1] or nil&lt;br /&gt;
&lt;br /&gt;
            local hasBottom = (b_i3 and (b_i3[3] or 0) ~= 0) or false&lt;br /&gt;
            local hasTop = (b_ip1_3 and (b_ip1_3[1] or 0) ~= 0) or false&lt;br /&gt;
&lt;br /&gt;
            -- bounds guards&lt;br /&gt;
            if hasBottom and (i - 1) &amp;gt;= 1 then&lt;br /&gt;
                Ent[i - 1] = {ctype = &amp;quot;line&amp;quot;, border = &amp;quot;bottom&amp;quot;}&lt;br /&gt;
                Ent[i] = Ent[i] or {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
            end&lt;br /&gt;
            if hasTop and (i + 1) &amp;lt;= R then&lt;br /&gt;
                Ent[i + 1] = {ctype = &amp;quot;line&amp;quot;, border = &amp;quot;top&amp;quot;}&lt;br /&gt;
                if (i + 2) &amp;lt;= R then&lt;br /&gt;
                    Ent[i + 2] = Ent[i + 2] or {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Thin same-color double-in at the right path column (k=3):&lt;br /&gt;
-- If both U (row i, edge=3) and L (row i+1, edge=1) are STRONG and colors match,&lt;br /&gt;
-- make L a FEATHER =&amp;gt; 2U/1L.&lt;br /&gt;
local function thinDoubleInSameColorForColumn(j)&lt;br /&gt;
    local R = config.r&lt;br /&gt;
    local pc = state.pathCell[j]&lt;br /&gt;
    if not pc then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i = 1, R - 1 do&lt;br /&gt;
        local cellU = pc[i] and pc[i][3] -- row i, k=3 (U edge lives here at b[3])&lt;br /&gt;
        local cellL = pc[i + 1] and pc[i + 1][3] -- row i+1, k=3 (L edge lives here at b[1])&lt;br /&gt;
        if cellU and cellL and cellU[1] and cellL[1] then&lt;br /&gt;
            local bU, bL = cellU[1], cellL[1]&lt;br /&gt;
            local uStrong = (bU[3] or 0) == STRONG&lt;br /&gt;
            local lStrong = (bL[1] or 0) == STRONG&lt;br /&gt;
            -- Only thin when BOTH sides are strong and colors match&lt;br /&gt;
            if uStrong and lStrong and cellU.color == cellL.color then&lt;br /&gt;
                bL[1] = FEATHER -- 2U2L -&amp;gt; 2U1L&lt;br /&gt;
            -- keep color as-is (already the same on both cells)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rememberRowStyle(rowStyleByColor, sRow, color, side, feather)&lt;br /&gt;
    local map = rowStyleByColor[sRow]&lt;br /&gt;
    if not map then&lt;br /&gt;
        map = {}&lt;br /&gt;
        rowStyleByColor[sRow] = map&lt;br /&gt;
    end&lt;br /&gt;
    map[color] = {side = side, feather = feather}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function summarizeDirs(items)&lt;br /&gt;
    local hasUp, hasDown, hasStraight = false, false, false&lt;br /&gt;
    local upColor, downColor, straightColor&lt;br /&gt;
    for _, it in ipairs(items) do&lt;br /&gt;
        if it.dir == &amp;quot;up&amp;quot; then&lt;br /&gt;
            hasUp, upColor = true, it.color&lt;br /&gt;
        end&lt;br /&gt;
        if it.dir == &amp;quot;down&amp;quot; then&lt;br /&gt;
            hasDown, downColor = true, it.color&lt;br /&gt;
        end&lt;br /&gt;
        if it.dir == &amp;quot;straight&amp;quot; then&lt;br /&gt;
            hasStraight, straightColor = true, it.color&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return hasUp, hasDown, hasStraight, upColor, downColor, straightColor&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===========================&lt;br /&gt;
-- 11) MAIN PATH DRAWING LOOP&lt;br /&gt;
-- ===========================&lt;br /&gt;
local function drawPathsForColumn(j)&lt;br /&gt;
    local R = config.r&lt;br /&gt;
&lt;br /&gt;
    ensureColumnScaffolding(j)&lt;br /&gt;
&lt;br /&gt;
    local crossRows, hasCross = getCrossRowsFor(j)&lt;br /&gt;
    state.hascross[j] = hasCross&lt;br /&gt;
&lt;br /&gt;
    local paths = parsePaths(j) or {}&lt;br /&gt;
    local outByStart, straightStubs, centerUseByStart, inboundDownAt = {}, {}, {}, {}&lt;br /&gt;
&lt;br /&gt;
    -- record the chosen OUT style per starting row and color for this column&lt;br /&gt;
    local rowStyleByColor = {} -- [sRow] -&amp;gt; { [color] = { side=&amp;quot;upper&amp;quot;|&amp;quot;lower&amp;quot;, feather=bool } }&lt;br /&gt;
&lt;br /&gt;
    -- paint verticals + collect fork info&lt;br /&gt;
    for _, p in ipairs(paths) do&lt;br /&gt;
        local sIdx, eIdx = p[1], p[2]&lt;br /&gt;
        local color = p.color or defaultColor&lt;br /&gt;
        local sRow = rowOf(j, sIdx)&lt;br /&gt;
        local eRow = rowOf(j + 1, eIdx)&lt;br /&gt;
&lt;br /&gt;
        -- skip if either endpoint suppressed; avoid cycles by using isPathHidden&lt;br /&gt;
        local leftDisp = dispositionOf(j, sRow)&lt;br /&gt;
        local rightDisp = dispositionOf(j + 1, eRow)&lt;br /&gt;
        if not isPathHidden(j, sRow, eRow, leftDisp, rightDisp) then&lt;br /&gt;
            local dir = (sRow &amp;lt; eRow) and &amp;quot;down&amp;quot; or ((sRow &amp;gt; eRow) and &amp;quot;up&amp;quot; or &amp;quot;straight&amp;quot;)&lt;br /&gt;
            if dir == &amp;quot;down&amp;quot; then&lt;br /&gt;
                inboundDownAt[eRow] = true&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            local bucket = outByStart[sRow]&lt;br /&gt;
            if not bucket then&lt;br /&gt;
                bucket = {}&lt;br /&gt;
                outByStart[sRow] = bucket&lt;br /&gt;
            end&lt;br /&gt;
            bucket[#bucket + 1] = {dir = dir, color = color}&lt;br /&gt;
&lt;br /&gt;
            if dir ~= &amp;quot;straight&amp;quot; then&lt;br /&gt;
                paintVerticalWithCross(j, sRow, eRow, dir, color, crossRows, hasCross, centerUseByStart, inboundDownAt)&lt;br /&gt;
            else&lt;br /&gt;
                local list = straightStubs[sRow] or {}&lt;br /&gt;
                straightStubs[sRow] = list&lt;br /&gt;
                list[#list + 1] = {stopRow = eRow, color = color}&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- decide fork placements and paint edges/joins/stubs&lt;br /&gt;
    local incomingStyle = detectIncomingStyle(j) -- row -&amp;gt; {side, feather}&lt;br /&gt;
&lt;br /&gt;
    for sRow, items in pairs(outByStart) do&lt;br /&gt;
        local hasUp, hasDown, hasStraight, upColor, downColor, straightColor = summarizeDirs(items)&lt;br /&gt;
        local straightPlacement = &amp;quot;upper&amp;quot; -- default&lt;br /&gt;
        local wantTopLower, topColor = false, nil&lt;br /&gt;
        local wantBottomUpper, bottomColor = false, nil&lt;br /&gt;
&lt;br /&gt;
        if hasUp then&lt;br /&gt;
            wantBottomUpper = true&lt;br /&gt;
            bottomColor = upColor&lt;br /&gt;
        end&lt;br /&gt;
        if hasDown then&lt;br /&gt;
            wantTopLower = true&lt;br /&gt;
            topColor = downColor&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if hasStraight then&lt;br /&gt;
            if hasUp then&lt;br /&gt;
                straightPlacement = &amp;quot;lower&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                local needsLower = false&lt;br /&gt;
                local list = straightStubs[sRow]&lt;br /&gt;
                if list then&lt;br /&gt;
                    for _, stub in ipairs(list) do&lt;br /&gt;
                        if inboundDownAt[stub.stopRow] then&lt;br /&gt;
                            needsLower = true&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if needsLower then&lt;br /&gt;
                    straightPlacement = &amp;quot;lower&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            if straightPlacement == &amp;quot;lower&amp;quot; then&lt;br /&gt;
                wantTopLower = true&lt;br /&gt;
                topColor = straightColor or topColor&lt;br /&gt;
            else&lt;br /&gt;
                wantBottomUpper = true&lt;br /&gt;
                bottomColor = straightColor or bottomColor&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- obey forced incoming placement if a through-edge exists from the left&lt;br /&gt;
        local appliedForced = nil&lt;br /&gt;
        do&lt;br /&gt;
            local leftHasBottom, leftHasTop = throughEdgesMaskAt(j, sRow)&lt;br /&gt;
            if (leftHasBottom or leftHasTop) then&lt;br /&gt;
                local info = incomingStyle[sRow] -- { side=&amp;quot;upper&amp;quot;|&amp;quot;lower&amp;quot;, feather=... } or nil&lt;br /&gt;
                if info and (info.side == &amp;quot;upper&amp;quot; or info.side == &amp;quot;lower&amp;quot;) then&lt;br /&gt;
                    appliedForced = info.side&lt;br /&gt;
                    -- make side intent explicit so later logic is consistent&lt;br /&gt;
                    wantBottomUpper, wantTopLower = (appliedForced == &amp;quot;upper&amp;quot;), (appliedForced == &amp;quot;lower&amp;quot;)&lt;br /&gt;
                    if appliedForced == &amp;quot;upper&amp;quot; then&lt;br /&gt;
                        bottomColor = bottomColor or straightColor or upColor or downColor or defaultColor&lt;br /&gt;
                        straightPlacement = &amp;quot;upper&amp;quot;&lt;br /&gt;
                    else&lt;br /&gt;
                        topColor = topColor or straightColor or upColor or downColor or defaultColor&lt;br /&gt;
                        straightPlacement = &amp;quot;lower&amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- preserve prior through-edges if present&lt;br /&gt;
        do&lt;br /&gt;
            local prevBottom, prevTop = throughEdgesMaskAt(j, sRow)&lt;br /&gt;
            if prevBottom or prevTop then&lt;br /&gt;
                wantBottomUpper = prevBottom&lt;br /&gt;
                wantTopLower = prevTop&lt;br /&gt;
                if prevBottom ~= prevTop then&lt;br /&gt;
                    appliedForced = prevBottom and &amp;quot;upper&amp;quot; or &amp;quot;lower&amp;quot;&lt;br /&gt;
                    straightPlacement = appliedForced&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- Decide the style to use for a single outgoing path on this row.&lt;br /&gt;
        local isSingleOut = (#items == 1)&lt;br /&gt;
&lt;br /&gt;
        -- default for single-out: always &amp;quot;upper&amp;quot; (2U/1L), unless forced by left through&lt;br /&gt;
        local styleSingle&lt;br /&gt;
        if isSingleOut then&lt;br /&gt;
            styleSingle = appliedForced or &amp;quot;upper&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            -- multi-out: keep existing side selection logic&lt;br /&gt;
            if appliedForced then&lt;br /&gt;
                styleSingle = appliedForced -- &amp;quot;upper&amp;quot; | &amp;quot;lower&amp;quot;&lt;br /&gt;
            elseif wantBottomUpper and not wantTopLower then&lt;br /&gt;
                styleSingle = &amp;quot;upper&amp;quot;&lt;br /&gt;
            elseif wantTopLower and not wantBottomUpper then&lt;br /&gt;
                styleSingle = &amp;quot;lower&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                styleSingle = &amp;quot;upper&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- If we have a through edge from the left, try to copy feather/no-feather from the incoming.&lt;br /&gt;
        local lb, lt = throughEdgesMaskAt(j, sRow)&lt;br /&gt;
        local throughHere = (dispositionOf(j, sRow) == &amp;quot;through&amp;quot;) or lb or lt&lt;br /&gt;
        local forcedInfo = throughHere and incomingStyle[sRow] or nil -- gate by through&lt;br /&gt;
        local forcedFeather = forcedInfo and forcedInfo.feather -- true | false | nil&lt;br /&gt;
&lt;br /&gt;
        if isSingleOut then&lt;br /&gt;
            local singleColor = (items[1] and items[1].color) or bottomColor or topColor or defaultColor&lt;br /&gt;
&lt;br /&gt;
            if forcedFeather == false then&lt;br /&gt;
                -- through row and incoming was NO feather → out₂ NO feather&lt;br /&gt;
                OUT(j, sRow, styleSingle, false, singleColor)&lt;br /&gt;
                rememberRowStyle(rowStyleByColor, sRow, singleColor, styleSingle, false)&lt;br /&gt;
            else&lt;br /&gt;
                -- either not a through row, or incoming was feather/unknown → use feathered out (2U/1L)&lt;br /&gt;
                OUT(j, sRow, styleSingle, true, singleColor)&lt;br /&gt;
                rememberRowStyle(rowStyleByColor, sRow, singleColor, styleSingle, true)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            -- Multi-out: split sides (no feather), and record&lt;br /&gt;
            local upC = hasUp and (upColor or defaultColor) or nil&lt;br /&gt;
            local downC = hasDown and (downColor or defaultColor) or nil&lt;br /&gt;
            local straightC = hasStraight and (straightColor or defaultColor) or nil&lt;br /&gt;
&lt;br /&gt;
            local upperColors, lowerColors = {}, {}&lt;br /&gt;
&lt;br /&gt;
            if hasUp and hasDown and not hasStraight then&lt;br /&gt;
                upperColors[upC] = true -- up → U&lt;br /&gt;
                lowerColors[downC] = true -- down → L&lt;br /&gt;
            elseif hasStraight and hasDown and not hasUp then&lt;br /&gt;
                upperColors[straightC] = true -- straight → U&lt;br /&gt;
                lowerColors[downC] = true -- down → L&lt;br /&gt;
            elseif hasStraight and hasUp and not hasDown then&lt;br /&gt;
                upperColors[upC] = true -- up → U&lt;br /&gt;
                lowerColors[straightC] = true -- straight → L&lt;br /&gt;
            else&lt;br /&gt;
                if wantBottomUpper then&lt;br /&gt;
                    upperColors[(bottomColor or defaultColor)] = true&lt;br /&gt;
                end&lt;br /&gt;
                if wantTopLower then&lt;br /&gt;
                    lowerColors[(topColor or defaultColor)] = true&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            if next(upperColors) then&lt;br /&gt;
                for colstr, _ in pairs(upperColors) do&lt;br /&gt;
                    paintEdge(j, sRow, 1, 3, STRONG, colstr) -- 2U, 0L&lt;br /&gt;
                    rememberRowStyle(rowStyleByColor, sRow, colstr, &amp;quot;upper&amp;quot;, false)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if next(lowerColors) and (sRow + 1) &amp;lt;= R then&lt;br /&gt;
                for colstr, _ in pairs(lowerColors) do&lt;br /&gt;
                    paintEdge(j, sRow + 1, 1, 1, STRONG, colstr) -- 0U, 2L&lt;br /&gt;
                    rememberRowStyle(rowStyleByColor, sRow, colstr, &amp;quot;lower&amp;quot;, false)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local cu = centerUseByStart[sRow]&lt;br /&gt;
        if state.hascross[j] then&lt;br /&gt;
            -- Look up side+feather recorded for this row+color (falls back to a side, defaults feather=true)&lt;br /&gt;
            local function styleObjFor(color, fallbackSide)&lt;br /&gt;
                local map = rowStyleByColor[sRow]&lt;br /&gt;
                local info = map and color and map[color]&lt;br /&gt;
                if info then&lt;br /&gt;
                    return info.side, info.feather&lt;br /&gt;
                end&lt;br /&gt;
                return fallbackSide, true&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Non-crossing UP hop uses center join: mimic out style for that color&lt;br /&gt;
            if cu and cu.up then&lt;br /&gt;
                local color = upColor or defaultColor&lt;br /&gt;
                local side, feather = styleObjFor(color, appliedForced or &amp;quot;upper&amp;quot;)&lt;br /&gt;
                if feather == false then&lt;br /&gt;
                    JOIN(j, sRow, side, false, color)&lt;br /&gt;
                else&lt;br /&gt;
                    JOIN(j, sRow, side, true, color)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Non-crossing DOWN hop uses center join: mimic out style for that color&lt;br /&gt;
            if cu and cu.down then&lt;br /&gt;
                local color = downColor or defaultColor&lt;br /&gt;
                local side, feather = styleObjFor(color, appliedForced or &amp;quot;lower&amp;quot;)&lt;br /&gt;
                if feather == false then&lt;br /&gt;
                    JOIN(j, sRow, side, false, color)&lt;br /&gt;
                else&lt;br /&gt;
                    JOIN(j, sRow, side, true, color)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Non-crossing STRAIGHT(s): there can be multiple colors; do one join per color&lt;br /&gt;
            if hasStraight and straightStubs[sRow] then&lt;br /&gt;
                local seen = {}&lt;br /&gt;
                for _, stub in ipairs(straightStubs[sRow]) do&lt;br /&gt;
                    local color = stub.color or bottomColor or topColor or defaultColor&lt;br /&gt;
                    if not seen[color] then&lt;br /&gt;
                        seen[color] = true&lt;br /&gt;
                        local fallbackSide = (straightPlacement == &amp;quot;lower&amp;quot; and &amp;quot;lower&amp;quot; or &amp;quot;upper&amp;quot;)&lt;br /&gt;
                        local side, feather = styleObjFor(color, fallbackSide)&lt;br /&gt;
                        if feather == false then&lt;br /&gt;
                            JOIN(j, sRow, side, false, color)&lt;br /&gt;
                        else&lt;br /&gt;
                            JOIN(j, sRow, side, true, color)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if hasStraight and straightStubs[sRow] then&lt;br /&gt;
            for _, stub in ipairs(straightStubs[sRow]) do&lt;br /&gt;
                local color = stub.color or bottomColor or topColor or defaultColor&lt;br /&gt;
                local info = rowStyleByColor[sRow] and rowStyleByColor[sRow][color]&lt;br /&gt;
                local side =&lt;br /&gt;
                    (info and info.side) or appliedForced or styleSingle or&lt;br /&gt;
                    (straightPlacement == &amp;quot;lower&amp;quot; and &amp;quot;lower&amp;quot; or &amp;quot;upper&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                if info and info.feather == false then&lt;br /&gt;
                    -- origin was a shared split → IN should be no-feather (2U/0L or 0U/2L)&lt;br /&gt;
                    IN(j, stub.stopRow, side, false, color)&lt;br /&gt;
                else&lt;br /&gt;
                    -- single-out or unknown → IN mimics feathered OUT (2U/1L or 1U/2L)&lt;br /&gt;
                    IN(j, stub.stopRow, side, true, color)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Post-pass: thin same-color double-in stubs on this column&lt;br /&gt;
    thinDoubleInSameColorForColumn(j)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===============&lt;br /&gt;
-- 12) PUBLIC API&lt;br /&gt;
-- ===============&lt;br /&gt;
function Paths.build(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    clearPathsCache()&lt;br /&gt;
    computeRoundGates()&lt;br /&gt;
    computeSlotDispositions()&lt;br /&gt;
&lt;br /&gt;
    -- draw each path column, then immediately create through-lines for the team&lt;br /&gt;
    -- column to its right so the next path column can &amp;quot;see&amp;quot; them&lt;br /&gt;
    for j = config.minc, config.c - 1 do&lt;br /&gt;
        drawPathsForColumn(j)&lt;br /&gt;
        insertThroughLinesForColumn(j)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    finalizeThroughLineColors()&lt;br /&gt;
&lt;br /&gt;
    -- ensure last column exists for renderer (fills arrays to full size)&lt;br /&gt;
    ensureColumnScaffolding(config.c)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =======================&lt;br /&gt;
-- 13) POST-PASS GROUPING&lt;br /&gt;
-- =======================&lt;br /&gt;
local function isBlankOrBlankText(col, row)&lt;br /&gt;
    local ent = entries(col)&lt;br /&gt;
    if not ent then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    local top = ent[row]&lt;br /&gt;
    local bot = ent[row + 1]&lt;br /&gt;
    if top == nil then&lt;br /&gt;
        if bot == nil then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
        if bot.ctype == &amp;quot;text&amp;quot; and isBlankEntry(col, row + 1) then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    elseif top.ctype == &amp;quot;text&amp;quot; and isBlankEntry(col, row) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function applyGroups() -- cosmetic grouping labels spanning left&lt;br /&gt;
    local R = config.r&lt;br /&gt;
    for j = config.minc, config.c - 1 do&lt;br /&gt;
        if (state.teamsPerMatch[j] or 2) == 2 then&lt;br /&gt;
            local groupIndex = 0&lt;br /&gt;
            for i = 1, R - 1 do&lt;br /&gt;
                local hasBottom = (getEdge(j, i, 3, 3) == STRONG)&lt;br /&gt;
                local hasTop = (getEdge(j, i + 1, 3, 1) == STRONG)&lt;br /&gt;
                if hasBottom or hasTop then&lt;br /&gt;
                    groupIndex = groupIndex + 1&lt;br /&gt;
                    if isBlankOrBlankText(j, i) then&lt;br /&gt;
                        local k = 0&lt;br /&gt;
                        repeat&lt;br /&gt;
                            local col = j - k&lt;br /&gt;
                            if&lt;br /&gt;
                                state.entries[col] and state.entries[col][i + 1] and&lt;br /&gt;
                                    state.entries[col][i + 1].ctype == &amp;quot;text&amp;quot; and&lt;br /&gt;
                                    isBlankEntry(col, i + 1)&lt;br /&gt;
                             then&lt;br /&gt;
                                state.entries[col][i + 2] = nil&lt;br /&gt;
                            end&lt;br /&gt;
&lt;br /&gt;
                            state.entries[col] = state.entries[col] or {}&lt;br /&gt;
                            state.entries[col][i] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
                            state.entries[col][i + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
                            if k &amp;gt; 0 and StateChecks.noPaths(col, i) then&lt;br /&gt;
                                state.skipPath[col] = state.skipPath[col] or {}&lt;br /&gt;
                                state.skipPath[col][i] = true&lt;br /&gt;
                                state.skipPath[col][i + 1] = true&lt;br /&gt;
                            end&lt;br /&gt;
&lt;br /&gt;
                            k = k + 1&lt;br /&gt;
                        until k &amp;gt; (j - 1) or not isBlankOrBlankText(j - k, i) or not StateChecks.noPaths(j - k, i)&lt;br /&gt;
&lt;br /&gt;
                        k = k - 1&lt;br /&gt;
                        local leftCol = j - k&lt;br /&gt;
                        local oj = origJ(j)&lt;br /&gt;
                        state.entries[leftCol] = state.entries[leftCol] or {}&lt;br /&gt;
                        state.entries[leftCol][i] = {&lt;br /&gt;
                            ctype = &amp;quot;group&amp;quot;,&lt;br /&gt;
                            index = groupIndex,&lt;br /&gt;
                            colspan = k + 1,&lt;br /&gt;
                            group = bargs(&amp;quot;RD&amp;quot; .. oj .. &amp;quot;-group&amp;quot; .. groupIndex),&lt;br /&gt;
                            align = &amp;quot;center&amp;quot;&lt;br /&gt;
                        }&lt;br /&gt;
                        state.entries[leftCol][i + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Paths.attachGroups(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    if _state then&lt;br /&gt;
        bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    end&lt;br /&gt;
    applyGroups()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Paths&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Params&amp;diff=76410</id>
		<title>Module:Build bracket/Params</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Params&amp;diff=76410"/>
		<updated>2026-07-24T10:50:38Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Params = {}&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 1) MODULE BINDINGS&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Upvalues bound per call&lt;br /&gt;
local state, config, Helpers, StateChecks&lt;br /&gt;
&lt;br /&gt;
-- Stdlib aliases&lt;br /&gt;
local str_format = string.format&lt;br /&gt;
local t_insert = table.insert&lt;br /&gt;
local t_sort = table.sort&lt;br /&gt;
&lt;br /&gt;
-- Locals filled on bind (with safe fallbacks)&lt;br /&gt;
local isempty, notempty, bargs, getPArg, getFArg, toChar, split&lt;br /&gt;
&lt;br /&gt;
local function _toCharFallback(n)&lt;br /&gt;
    n = tonumber(n or 0) or 0&lt;br /&gt;
    if n &amp;gt;= 1 and n &amp;lt;= 26 then&lt;br /&gt;
        return string.char(96 + n) -- &#039;a&#039;..&#039;z&#039;&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(n)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    state, config, Helpers, StateChecks = _state, _config, _Helpers, _StateChecks&lt;br /&gt;
    isempty = Helpers and Helpers.isempty or function(v)&lt;br /&gt;
            return v == nil or v == &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    notempty = Helpers and Helpers.notempty or function(v)&lt;br /&gt;
            return v ~= nil and v ~= &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    bargs = Helpers and Helpers.bargs&lt;br /&gt;
    getPArg = Helpers and Helpers.getPArg&lt;br /&gt;
    getFArg = Helpers and Helpers.getFArg&lt;br /&gt;
    toChar = (Helpers and Helpers.toChar) or _toCharFallback&lt;br /&gt;
    split = Helpers and Helpers.split&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Try both RDj[a]-X and RDj[A]-X; falls back to &amp;quot;&amp;quot; if not present&lt;br /&gt;
local function readPerHeaderArg(j, k, suffix)&lt;br /&gt;
    local ch = toChar(k) -- e.g. &#039;a&#039; with Helpers.toChar&lt;br /&gt;
    local key1 = &amp;quot;RD&amp;quot; .. j .. ch .. suffix&lt;br /&gt;
    local v = bargs(key1)&lt;br /&gt;
    if v ~= nil and v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        return v&lt;br /&gt;
    end&lt;br /&gt;
    local key2 = &amp;quot;RD&amp;quot; .. j .. string.upper(ch) .. suffix&lt;br /&gt;
    v = bargs(key2)&lt;br /&gt;
    if v ~= nil and v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        return v&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 2) ARG HELPERS&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Trim + split a comma list frame arg (returns {} on blank)&lt;br /&gt;
local function readCsvArg(name)&lt;br /&gt;
    local raw = (getFArg(name) or &amp;quot;&amp;quot;):gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    return split(raw, {&amp;quot;,&amp;quot;}, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 3) BUILD SKELETON (formerly getCells)&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function buildSkeleton()&lt;br /&gt;
    local DEFAULT_TPM = 2&lt;br /&gt;
    local maxrow = 1&lt;br /&gt;
    local colentry = {}&lt;br /&gt;
    local hasNoHeaders = true&lt;br /&gt;
&lt;br /&gt;
    -- ensure containers&lt;br /&gt;
    state.entries = state.entries or {}&lt;br /&gt;
    state.shift = state.shift or {}&lt;br /&gt;
    state.teamsPerMatch = state.teamsPerMatch or {}&lt;br /&gt;
    state.maxtpm = state.maxtpm or 0&lt;br /&gt;
&lt;br /&gt;
    local Cmin, Cmax = config.minc, config.c&lt;br /&gt;
&lt;br /&gt;
    -- Phase 1: Determine header presence and teamsPerMatch&lt;br /&gt;
    for j = Cmin, Cmax do&lt;br /&gt;
        if notempty(getFArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-headers&amp;quot;)) then&lt;br /&gt;
            hasNoHeaders = false&lt;br /&gt;
        end&lt;br /&gt;
        local tpm =&lt;br /&gt;
            tonumber(getFArg(&amp;quot;RD&amp;quot; .. j .. &amp;quot;-teams-per-match&amp;quot;)) or tonumber(getFArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-teams-per-match&amp;quot;)) or&lt;br /&gt;
            tonumber(getFArg(&amp;quot;teams-per-match&amp;quot;)) or&lt;br /&gt;
            DEFAULT_TPM&lt;br /&gt;
        state.teamsPerMatch[j] = tpm&lt;br /&gt;
        if tpm &amp;gt; state.maxtpm then&lt;br /&gt;
            state.maxtpm = tpm&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Phase 2: Build colentry for each column&lt;br /&gt;
    for j = Cmin, Cmax do&lt;br /&gt;
        state.entries[j] = {}&lt;br /&gt;
        state.shift[j] = tonumber(bargs(&amp;quot;RD&amp;quot; .. j .. &amp;quot;-shift&amp;quot;)) or tonumber(bargs(&amp;quot;shift&amp;quot;)) or 0&lt;br /&gt;
&lt;br /&gt;
        colentry[j] = {&lt;br /&gt;
            readCsvArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-headers&amp;quot;),&lt;br /&gt;
            readCsvArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-matches&amp;quot;),&lt;br /&gt;
            readCsvArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-lines&amp;quot;),&lt;br /&gt;
            readCsvArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-text&amp;quot;),&lt;br /&gt;
            readCsvArg(&amp;quot;col&amp;quot; .. j .. &amp;quot;-groups&amp;quot;) -- reserved for user-specified groups&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        -- inject a default header if none were specified anywhere (unless noheaders=y/yes)&lt;br /&gt;
        local noheaders = (getFArg(&amp;quot;noheaders&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if hasNoHeaders and (noheaders ~= &amp;quot;y&amp;quot; and noheaders ~= &amp;quot;yes&amp;quot;) then&lt;br /&gt;
            t_insert(colentry[j][1], 1)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Ctype mapping for colentry positions&lt;br /&gt;
    local CTYPE_MAP = {&amp;quot;header&amp;quot;, &amp;quot;team&amp;quot;, &amp;quot;line&amp;quot;, &amp;quot;text&amp;quot;, &amp;quot;group&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
    -- Helpers to populate entries (preserve legacy shapes)&lt;br /&gt;
    local function populateTeam(j, rowIndex, n)&lt;br /&gt;
        local TPM = state.teamsPerMatch[j]&lt;br /&gt;
        -- scaffold a text row above when needed (legacy behavior)&lt;br /&gt;
        if state.entries[j][rowIndex - 1] == nil and state.entries[j][rowIndex - 2] == nil then&lt;br /&gt;
            state.entries[j][rowIndex - 2] = {ctype = &amp;quot;text&amp;quot;, index = n}&lt;br /&gt;
            state.entries[j][rowIndex - 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
        end&lt;br /&gt;
        -- first team (top)&lt;br /&gt;
        state.entries[j][rowIndex] = {ctype = &amp;quot;team&amp;quot;, index = TPM * n - (TPM - 1), position = &amp;quot;top&amp;quot;}&lt;br /&gt;
        state.entries[j][rowIndex + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
        -- remaining teams in the match (every 2 rows)&lt;br /&gt;
        for m = 2, TPM do&lt;br /&gt;
            local idx = TPM * n - (TPM - m)&lt;br /&gt;
            local r = rowIndex + 2 * (m - 1)&lt;br /&gt;
            state.entries[j][r] = {ctype = &amp;quot;team&amp;quot;, index = idx}&lt;br /&gt;
            state.entries[j][r + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function populateText(j, rowIndex, index)&lt;br /&gt;
        state.entries[j][rowIndex] = {ctype = &amp;quot;text&amp;quot;, index = index}&lt;br /&gt;
        state.entries[j][rowIndex + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function populateLine(j, rowIndex)&lt;br /&gt;
        -- first segment draws its bottom edge&lt;br /&gt;
        state.entries[j][rowIndex] = {ctype = &amp;quot;line&amp;quot;, border = &amp;quot;bottom&amp;quot;}&lt;br /&gt;
        state.entries[j][rowIndex + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
        -- second segment draws its top edge&lt;br /&gt;
        state.entries[j][rowIndex + 2] = {ctype = &amp;quot;line&amp;quot;, border = &amp;quot;top&amp;quot;}&lt;br /&gt;
        state.entries[j][rowIndex + 3] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function populateGroup(j, rowIndex, n)&lt;br /&gt;
        state.entries[j][rowIndex] = {ctype = &amp;quot;group&amp;quot;, index = n}&lt;br /&gt;
        state.entries[j][rowIndex + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function populateDefault(j, rowIndex, n)&lt;br /&gt;
        state.entries[j][rowIndex] = {ctype = &amp;quot;header&amp;quot;, index = n, position = &amp;quot;top&amp;quot;}&lt;br /&gt;
        state.entries[j][rowIndex + 1] = {ctype = &amp;quot;blank&amp;quot;}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Phase 3: Populate entries for each column&lt;br /&gt;
    for j = Cmin, Cmax do&lt;br /&gt;
        local textindex = 0&lt;br /&gt;
        local TPM = state.teamsPerMatch[j]&lt;br /&gt;
        local shiftJ = state.shift[j]&lt;br /&gt;
&lt;br /&gt;
        for k, positions in ipairs(colentry[j]) do&lt;br /&gt;
            t_sort(positions)&lt;br /&gt;
            local ctype = CTYPE_MAP[k]&lt;br /&gt;
&lt;br /&gt;
            for n = 1, #positions do&lt;br /&gt;
                if shiftJ ~= 0 and positions[n] &amp;gt; 1 then&lt;br /&gt;
                    positions[n] = positions[n] + shiftJ&lt;br /&gt;
                end&lt;br /&gt;
                local rowIndex = 2 * positions[n] - 1&lt;br /&gt;
                local lastRow = rowIndex + 2 * TPM - 1&lt;br /&gt;
                if lastRow &amp;gt; maxrow then&lt;br /&gt;
                    maxrow = lastRow&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                    populateTeam(j, rowIndex, n)&lt;br /&gt;
                    textindex = n&lt;br /&gt;
                elseif ctype == &amp;quot;text&amp;quot; then&lt;br /&gt;
                    populateText(j, rowIndex, textindex + n)&lt;br /&gt;
                elseif ctype == &amp;quot;line&amp;quot; then&lt;br /&gt;
                    populateLine(j, rowIndex)&lt;br /&gt;
                elseif ctype == &amp;quot;group&amp;quot; then&lt;br /&gt;
                    populateGroup(j, rowIndex, n)&lt;br /&gt;
                else&lt;br /&gt;
                    populateDefault(j, rowIndex, n)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if isempty(config.r) then&lt;br /&gt;
        config.r = maxrow&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 4) NAME RESOLUTION HELPERS&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function paramNames(cname, j, i, l)&lt;br /&gt;
    local function getArg(key)&lt;br /&gt;
        return bargs(key) or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    local function getP(key)&lt;br /&gt;
        return getPArg(key) or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local e = state.entries[j][i]&lt;br /&gt;
    local RD = &amp;quot;RD&amp;quot; .. j&lt;br /&gt;
    local hidx = e.headerindex&lt;br /&gt;
    local hchar = toChar(hidx)&lt;br /&gt;
    local RDh = RD .. hchar&lt;br /&gt;
&lt;br /&gt;
    local SYNONYMS = {legs = {&amp;quot;legs&amp;quot;, &amp;quot;sets&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
    -- Try a list of names against base+index(+suffix); returns first non-empty&lt;br /&gt;
    local function tryAny(base, names, idx, suffix)&lt;br /&gt;
        suffix = suffix or &amp;quot;&amp;quot;&lt;br /&gt;
        for _, nm in ipairs(names) do&lt;br /&gt;
            local a = bargs(base .. &amp;quot;-&amp;quot; .. nm .. idx .. suffix) or &amp;quot;&amp;quot;&lt;br /&gt;
            if isempty(a) then&lt;br /&gt;
                a = bargs(base .. &amp;quot;-&amp;quot; .. nm .. string.format(&amp;quot;%02d&amp;quot;, idx) .. suffix) or &amp;quot;&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            if notempty(a) then&lt;br /&gt;
                return a&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function tryBoth(base, name, idx, suffix)&lt;br /&gt;
        suffix = suffix or &amp;quot;&amp;quot;&lt;br /&gt;
        local a = getArg(base .. &amp;quot;-&amp;quot; .. name .. idx .. suffix)&lt;br /&gt;
        if isempty(a) then&lt;br /&gt;
            a = getArg(base .. &amp;quot;-&amp;quot; .. name .. str_format(&amp;quot;%02d&amp;quot;, idx) .. suffix)&lt;br /&gt;
        end&lt;br /&gt;
        return a&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Round names (prefer altname when present)&lt;br /&gt;
    local RDlabel = getArg(RD .. &amp;quot;-altname&amp;quot;) or RD&lt;br /&gt;
    local RDhlabel = getArg(RDh .. &amp;quot;-altname&amp;quot;) or RDh&lt;br /&gt;
&lt;br /&gt;
    local rname = {{RD, RDlabel}, {RDh, RDhlabel}}&lt;br /&gt;
    local name = {cname, getArg(cname .. &amp;quot;-altname&amp;quot;) or cname}&lt;br /&gt;
    local nameKeys = SYNONYMS[cname] or {name[1]}&lt;br /&gt;
    local index = {e.index, e.altindex}&lt;br /&gt;
    local result = {}&lt;br /&gt;
&lt;br /&gt;
    if cname == &amp;quot;header&amp;quot; then&lt;br /&gt;
        if hidx == 1 then&lt;br /&gt;
            for _, base in ipairs({rname[1], rname[2]}) do&lt;br /&gt;
                for k = 2, 1, -1 do&lt;br /&gt;
                    result[#result + 1] = getArg(base[k])&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            for k = 2, 1, -1 do&lt;br /&gt;
                result[#result + 1] = getArg(rname[2][k])&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    elseif cname == &amp;quot;pheader&amp;quot; then&lt;br /&gt;
        if hidx == 1 then&lt;br /&gt;
            for _, base in ipairs({rname[1], rname[2]}) do&lt;br /&gt;
                for k = 2, 1, -1 do&lt;br /&gt;
                    result[#result + 1] = getP(base[k])&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            for k = 2, 1, -1 do&lt;br /&gt;
                result[#result + 1] = getP(rname[2][k])&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    elseif cname == &amp;quot;score&amp;quot; then&lt;br /&gt;
        local bases = {rname[2][2], rname[2][1], rname[1][2], rname[1][1]}&lt;br /&gt;
        local idxs = {index[2], index[2], index[1], index[1]}&lt;br /&gt;
        for n = 1, 4 do&lt;br /&gt;
            if l == 1 then&lt;br /&gt;
                result[#result + 1] = tryAny(bases[n], nameKeys, idxs[n])&lt;br /&gt;
            end&lt;br /&gt;
            result[#result + 1] = tryAny(bases[n], nameKeys, idxs[n], &amp;quot;-&amp;quot; .. l)&lt;br /&gt;
        end&lt;br /&gt;
    elseif cname == &amp;quot;shade&amp;quot; then&lt;br /&gt;
        for k = 2, 1, -1 do&lt;br /&gt;
            local base = (hidx == 1) and rname[1][k] or rname[2][k]&lt;br /&gt;
            result[#result + 1] = getArg(base .. &amp;quot;-&amp;quot; .. name[1])&lt;br /&gt;
        end&lt;br /&gt;
        result[#result + 1] = getArg(&amp;quot;RD-shade&amp;quot;)&lt;br /&gt;
        result[#result + 1] = (config.COLORS and config.COLORS.cell_bg_dark) or &amp;quot;#eaecf0&amp;quot;&lt;br /&gt;
    elseif cname == &amp;quot;text&amp;quot; then&lt;br /&gt;
        local bases = {rname[2][2], rname[2][1], rname[1][2], rname[1][1]}&lt;br /&gt;
        local idxs = {index[2], index[2], index[1], index[1]}&lt;br /&gt;
        local names = {name[2], name[1]}&lt;br /&gt;
        for ni = 1, 2 do&lt;br /&gt;
            for n = 1, 4 do&lt;br /&gt;
                result[#result + 1] = tryBoth(bases[n], names[ni], idxs[n])&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        local bases = {rname[2][2], rname[2][1], rname[1][2], rname[1][1]}&lt;br /&gt;
        local idxs = {index[2], index[2], index[1], index[1]}&lt;br /&gt;
        for n = 1, 4 do&lt;br /&gt;
            result[#result + 1] = tryAny(bases[n], nameKeys, idxs[n])&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, val in ipairs(result) do&lt;br /&gt;
        if notempty(val) then&lt;br /&gt;
            return val&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 5) NUMBERED PARAM MODE&lt;br /&gt;
-- ========================================&lt;br /&gt;
local masterindex = 1&lt;br /&gt;
&lt;br /&gt;
local function numberedParams(j)&lt;br /&gt;
    local row = state.entries[j]&lt;br /&gt;
    if not row then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function nextArg()&lt;br /&gt;
        local v = bargs(tostring(masterindex)) or &amp;quot;&amp;quot;&lt;br /&gt;
        masterindex = masterindex + 1&lt;br /&gt;
        return v&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local R = config.r&lt;br /&gt;
    for i = 1, R do&lt;br /&gt;
        local e = row[i]&lt;br /&gt;
        if e then&lt;br /&gt;
            local ct = e.ctype&lt;br /&gt;
            if ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
                local legs = state.rlegs[j]&lt;br /&gt;
&lt;br /&gt;
                if config.forceseeds then&lt;br /&gt;
                    e.seed = nextArg()&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                e.team = nextArg()&lt;br /&gt;
                e.legs = paramNames(&amp;quot;legs&amp;quot;, j, i)&lt;br /&gt;
                e.score = {weight = {}}&lt;br /&gt;
                e.weight = &amp;quot;normal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                if notempty(e.legs) then&lt;br /&gt;
                    legs = tonumber(e.legs) or legs&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                for l = 1, legs do&lt;br /&gt;
                    e.score[l] = nextArg()&lt;br /&gt;
                    e.score.weight[l] = &amp;quot;normal&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if config.aggregate and legs &amp;gt; 1 then&lt;br /&gt;
                    e.score.agg = nextArg()&lt;br /&gt;
                    e.score.weight.agg = &amp;quot;normal&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
            elseif ct == &amp;quot;header&amp;quot; then&lt;br /&gt;
                e.header = paramNames(&amp;quot;header&amp;quot;, j, i)&lt;br /&gt;
                e.pheader = paramNames(&amp;quot;pheader&amp;quot;, j, i)&lt;br /&gt;
                e.shade = paramNames(&amp;quot;shade&amp;quot;, j, i)&lt;br /&gt;
            elseif ct == &amp;quot;text&amp;quot; then&lt;br /&gt;
                e.text = nextArg()&lt;br /&gt;
            elseif ct == &amp;quot;group&amp;quot; then&lt;br /&gt;
                e.group = nextArg()&lt;br /&gt;
            elseif ct == &amp;quot;line&amp;quot; and e.hastext == true then&lt;br /&gt;
                e.text = nextArg()&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 6) NAMED MODE ASSIGNERS (per-ctype)&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function cellHasMeaningfulContent(e)&lt;br /&gt;
    if not e then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    if e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
        return notempty(e.team)&lt;br /&gt;
    end&lt;br /&gt;
    if e.ctype == &amp;quot;text&amp;quot; then&lt;br /&gt;
        return notempty(e.text)&lt;br /&gt;
    end&lt;br /&gt;
    if e.ctype == &amp;quot;group&amp;quot; then&lt;br /&gt;
        return notempty(e.group)&lt;br /&gt;
    end&lt;br /&gt;
    if e.ctype == &amp;quot;line&amp;quot; and e.hastext == true then&lt;br /&gt;
        return notempty(e.text)&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function enforceContentUnhide(j)&lt;br /&gt;
    if not (state.hide and state.hide[j]) then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    local explicit = (state._hideExplicit and state._hideExplicit[j]) or {}&lt;br /&gt;
    local R = config.r&lt;br /&gt;
&lt;br /&gt;
    -- If master hid a header, but we later discover content in that header,&lt;br /&gt;
    -- flip it visible unless there was an EXPLICIT per-header hide.&lt;br /&gt;
    for i = 1, R do&lt;br /&gt;
        local e = state.entries[j][i]&lt;br /&gt;
        if e and e.headerindex then&lt;br /&gt;
            local h = e.headerindex&lt;br /&gt;
            if state.hide[j][h] and cellHasMeaningfulContent(e) then&lt;br /&gt;
                state.hide[j][h] = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignTeamParams(j, i)&lt;br /&gt;
    local legs = state.rlegs[j]&lt;br /&gt;
    local e = state.entries[j][i]&lt;br /&gt;
&lt;br /&gt;
    e.seed = paramNames(&amp;quot;seed&amp;quot;, j, i)&lt;br /&gt;
    e.team = paramNames(&amp;quot;team&amp;quot;, j, i)&lt;br /&gt;
    e.legs = paramNames(&amp;quot;legs&amp;quot;, j, i)&lt;br /&gt;
    e.score = {weight = {}}&lt;br /&gt;
    e.weight = &amp;quot;normal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if notempty(e.legs) then&lt;br /&gt;
        legs = tonumber(e.legs) or legs&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.autolegs then&lt;br /&gt;
        local l = 1&lt;br /&gt;
        repeat&lt;br /&gt;
            e.score[l] = paramNames(&amp;quot;score&amp;quot;, j, i, l)&lt;br /&gt;
            e.score.weight[l] = &amp;quot;normal&amp;quot;&lt;br /&gt;
            l = l + 1&lt;br /&gt;
        until isempty(paramNames(&amp;quot;score&amp;quot;, j, i, l))&lt;br /&gt;
        legs = l - 1&lt;br /&gt;
    else&lt;br /&gt;
        for l = 1, legs do&lt;br /&gt;
            e.score[l] = paramNames(&amp;quot;score&amp;quot;, j, i, l)&lt;br /&gt;
            e.score.weight[l] = &amp;quot;normal&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.aggregate and legs &amp;gt; 1 then&lt;br /&gt;
        e.score.agg = paramNames(&amp;quot;score&amp;quot;, j, i, &amp;quot;agg&amp;quot;)&lt;br /&gt;
        e.score.weight.agg = &amp;quot;normal&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignHeaderParams(j, i)&lt;br /&gt;
    local e = state.entries[j][i]&lt;br /&gt;
    e.header = paramNames(&amp;quot;header&amp;quot;, j, i)&lt;br /&gt;
    e.pheader = paramNames(&amp;quot;pheader&amp;quot;, j, i)&lt;br /&gt;
    e.shade = paramNames(&amp;quot;shade&amp;quot;, j, i)&lt;br /&gt;
&lt;br /&gt;
    -- Did shade originate from an RD*-shade param?&lt;br /&gt;
    local hchar = toChar(e.headerindex)&lt;br /&gt;
    local rdNames = {&lt;br /&gt;
        &amp;quot;RD&amp;quot; .. j .. &amp;quot;-shade&amp;quot;,&lt;br /&gt;
        &amp;quot;RD&amp;quot; .. j .. hchar .. &amp;quot;-shade&amp;quot;,&lt;br /&gt;
        &amp;quot;RD-shade&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    e.shade_is_rd = false&lt;br /&gt;
    for _, pname in ipairs(rdNames) do&lt;br /&gt;
        local v = bargs(pname)&lt;br /&gt;
        if notempty(v) and e.shade == v then&lt;br /&gt;
            e.shade_is_rd = true&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignTextParams(j, i)&lt;br /&gt;
    state.entries[j][i].text = paramNames(&amp;quot;text&amp;quot;, j, i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignGroupParams(j, i)&lt;br /&gt;
    state.entries[j][i].group = paramNames(&amp;quot;group&amp;quot;, j, i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignLineTextParams(j, i)&lt;br /&gt;
    state.entries[j][i].text = paramNames(&amp;quot;text&amp;quot;, j, i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 7) TABLE-WIDE ASSIGNMENT PASS&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function getScalarRoundParam(j, bases) -- e.g. {&amp;quot;legs&amp;quot;,&amp;quot;sets&amp;quot;}&lt;br /&gt;
    -- prefer per-round keys, then global&lt;br /&gt;
    for _, base in ipairs(bases) do&lt;br /&gt;
        local v = bargs(&amp;quot;RD&amp;quot; .. j .. &amp;quot;-&amp;quot; .. base)&lt;br /&gt;
        if notempty(v) then&lt;br /&gt;
            return v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    for _, base in ipairs(bases) do&lt;br /&gt;
        local v = bargs(base)&lt;br /&gt;
        if notempty(v) then&lt;br /&gt;
            return v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function assignParams()&lt;br /&gt;
    masterindex = 1&lt;br /&gt;
    local maxcol = 1&lt;br /&gt;
&lt;br /&gt;
    local Cmin, Cmax, R = config.minc, config.c, config.r&lt;br /&gt;
&lt;br /&gt;
    for j = Cmin, Cmax do&lt;br /&gt;
        -- prepare per-round containers&lt;br /&gt;
        state.hide[j] = state.hide[j] or {}&lt;br /&gt;
        state.byes[j] = state.byes[j] or {}&lt;br /&gt;
&lt;br /&gt;
        -- Set legs for this column&lt;br /&gt;
        local vlegs = getScalarRoundParam(j, {&amp;quot;legs&amp;quot;, &amp;quot;sets&amp;quot;})&lt;br /&gt;
        state.rlegs[j] = tonumber(vlegs) or 1&lt;br /&gt;
        if notempty(vlegs) then&lt;br /&gt;
            config.autolegs = false&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- assign params&lt;br /&gt;
        if config.paramstyle == &amp;quot;numbered&amp;quot; then&lt;br /&gt;
            numberedParams(j)&lt;br /&gt;
        else&lt;br /&gt;
            local col = state.entries[j]&lt;br /&gt;
            for i = 1, R do&lt;br /&gt;
                local cell = col[i]&lt;br /&gt;
                if cell ~= nil then&lt;br /&gt;
                    local ct = cell.ctype&lt;br /&gt;
                    if ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
                        assignTeamParams(j, i)&lt;br /&gt;
                    elseif ct == &amp;quot;header&amp;quot; then&lt;br /&gt;
                        assignHeaderParams(j, i)&lt;br /&gt;
                    elseif ct == &amp;quot;text&amp;quot; then&lt;br /&gt;
                        assignTextParams(j, i)&lt;br /&gt;
                    elseif ct == &amp;quot;group&amp;quot; then&lt;br /&gt;
                        assignGroupParams(j, i)&lt;br /&gt;
                    elseif ct == &amp;quot;line&amp;quot; and cell.hastext == true then&lt;br /&gt;
                        assignLineTextParams(j, i)&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if config.autocol and not StateChecks.isBlankEntry(j, i) and j &amp;gt; maxcol then&lt;br /&gt;
                    maxcol = j&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        enforceContentUnhide(j)&lt;br /&gt;
&lt;br /&gt;
        -- parent header text forces visible&lt;br /&gt;
        for i = 1, R do&lt;br /&gt;
            local e = state.entries[j][i]&lt;br /&gt;
            if e and e.ctype == &amp;quot;header&amp;quot; then&lt;br /&gt;
                local hidx = e.headerindex&lt;br /&gt;
                if (Helpers.notempty and Helpers.notempty(e.pheader)) then&lt;br /&gt;
                    state.hide[j][hidx] = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.autocol then&lt;br /&gt;
        config.c = maxcol&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 8) STRUCTURE DISCOVERY (hide/byes/indices)&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function getHide(j)&lt;br /&gt;
    state.hide[j] = {}&lt;br /&gt;
    state._hideExplicit = state._hideExplicit or {}&lt;br /&gt;
    state._hideExplicit[j] = {}&lt;br /&gt;
&lt;br /&gt;
    -- master round-level hide flag: RD{j}-hide&lt;br /&gt;
    local masterRaw = bargs(&amp;quot;RD&amp;quot; .. j .. &amp;quot;-hide&amp;quot;) or &amp;quot;&amp;quot;&lt;br /&gt;
    local masterOn = (Helpers and Helpers.yes and Helpers.yes(masterRaw)) or false&lt;br /&gt;
&lt;br /&gt;
    for k = 1, state.headerindex[j] do&lt;br /&gt;
        state.hide[j][k] = masterOn&lt;br /&gt;
&lt;br /&gt;
        -- per-header override&lt;br /&gt;
        local rh = readPerHeaderArg(j, k, &amp;quot;-hide&amp;quot;)&lt;br /&gt;
        if rh ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            if Helpers and Helpers.yes and Helpers.yes(rh) then&lt;br /&gt;
                state.hide[j][k] = true&lt;br /&gt;
                state._hideExplicit[j][k] = true&lt;br /&gt;
            elseif Helpers and Helpers.no and Helpers.no(rh) then&lt;br /&gt;
                state.hide[j][k] = false&lt;br /&gt;
                state._hideExplicit[j][k] = true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getByes(j)&lt;br /&gt;
    state.byes[j] = {}&lt;br /&gt;
    for k = 1, state.headerindex[j] do&lt;br /&gt;
        -- global byes&lt;br /&gt;
        local byes = (bargs(&amp;quot;byes&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if (Helpers.yes and Helpers.yes(byes)) then&lt;br /&gt;
            state.byes[j][k] = true&lt;br /&gt;
        elseif tonumber(byes) then&lt;br /&gt;
            state.byes[j][k] = (j &amp;lt;= tonumber(byes))&lt;br /&gt;
        else&lt;br /&gt;
            state.byes[j][k] = false&lt;br /&gt;
        end&lt;br /&gt;
        -- per-round byes&lt;br /&gt;
        local r = (bargs(&amp;quot;RD&amp;quot; .. j .. &amp;quot;-byes&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if (Helpers.yes and Helpers.yes(r)) then&lt;br /&gt;
            state.byes[j][k] = true&lt;br /&gt;
        elseif r == &amp;quot;no&amp;quot; or r == &amp;quot;n&amp;quot; then&lt;br /&gt;
            state.byes[j][k] = false&lt;br /&gt;
        end&lt;br /&gt;
        -- per-header byes&lt;br /&gt;
        local rh = (readPerHeaderArg(j, k, &amp;quot;-byes&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if (Helpers.yes and Helpers.yes(rh)) then&lt;br /&gt;
            state.byes[j][k] = true&lt;br /&gt;
        elseif rh == &amp;quot;no&amp;quot; or rh == &amp;quot;n&amp;quot; then&lt;br /&gt;
            state.byes[j][k] = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getAltIndices()&lt;br /&gt;
    local Cmin, Cmax, R = config.minc, config.c, config.r&lt;br /&gt;
&lt;br /&gt;
    for j = Cmin, Cmax do&lt;br /&gt;
        state.headerindex[j] = 0&lt;br /&gt;
&lt;br /&gt;
        -- per-round counters&lt;br /&gt;
        local teamindex, textindex, groupindex = 1, 1, 1&lt;br /&gt;
        local row = state.entries[j]&lt;br /&gt;
&lt;br /&gt;
        -- if the very first cell is nil, bump headerindex once (legacy quirk)&lt;br /&gt;
        if row and row[1] == nil then&lt;br /&gt;
            state.headerindex[j] = state.headerindex[j] + 1&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- walk rows in the round&lt;br /&gt;
        for i = 1, R do&lt;br /&gt;
            local e = row and row[i] or nil&lt;br /&gt;
            if e then&lt;br /&gt;
                local ct = e.ctype&lt;br /&gt;
                if ct == &amp;quot;header&amp;quot; then&lt;br /&gt;
                    e.altindex = state.headerindex[j]&lt;br /&gt;
                    teamindex, textindex = 1, 1&lt;br /&gt;
                    state.headerindex[j] = state.headerindex[j] + 1&lt;br /&gt;
                elseif ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
                    e.altindex = teamindex&lt;br /&gt;
                    teamindex = teamindex + 1&lt;br /&gt;
                elseif ct == &amp;quot;text&amp;quot; or (ct == &amp;quot;line&amp;quot; and e.hastext == true) then&lt;br /&gt;
                    e.altindex = textindex&lt;br /&gt;
                    textindex = textindex + 1&lt;br /&gt;
                elseif ct == &amp;quot;group&amp;quot; then&lt;br /&gt;
                    e.altindex = groupindex&lt;br /&gt;
                    groupindex = groupindex + 1&lt;br /&gt;
                end&lt;br /&gt;
                e.headerindex = state.headerindex[j]&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        getByes(j)&lt;br /&gt;
        getHide(j)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 9) PUBLIC API&lt;br /&gt;
-- ========================================&lt;br /&gt;
function Params.buildSkeleton(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    buildSkeleton()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Params.scanStructure(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    getAltIndices()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Params.assign(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    bind(_state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    assignParams()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ========================================&lt;br /&gt;
-- 10) SLICING FOR MIN ROUND (base offset)&lt;br /&gt;
-- ========================================&lt;br /&gt;
local function shiftCols(tbl, base, c)&lt;br /&gt;
    if not tbl then&lt;br /&gt;
        return {}&lt;br /&gt;
    end&lt;br /&gt;
    local out = {}&lt;br /&gt;
    for j = base + 1, c do&lt;br /&gt;
        out[j - base] = tbl[j]&lt;br /&gt;
    end&lt;br /&gt;
    return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Params.sliceForMinround(_state, _config)&lt;br /&gt;
    local base = _config.base or 0&lt;br /&gt;
    if base &amp;lt;= 0 then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local oldC = _config.c&lt;br /&gt;
    local newC = oldC - base&lt;br /&gt;
    if newC &amp;lt; 1 then&lt;br /&gt;
        newC = 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Shift all column-indexed tables&lt;br /&gt;
    _state.entries = shiftCols(_state.entries, base, oldC)&lt;br /&gt;
    _state.headerindex = shiftCols(_state.headerindex, base, oldC)&lt;br /&gt;
    _state.rlegs = shiftCols(_state.rlegs, base, oldC)&lt;br /&gt;
    _state.maxlegs = {} -- recompute later&lt;br /&gt;
    _state.hascross = {} -- rebuild later&lt;br /&gt;
    _state.crossCell = {} -- rebuild later&lt;br /&gt;
    _state.pathCell = {} -- rebuild later&lt;br /&gt;
    _state.skipPath = {} -- rebuild later&lt;br /&gt;
    _state.hide = shiftCols(_state.hide, base, oldC)&lt;br /&gt;
    _state.byes = shiftCols(_state.byes, base, oldC)&lt;br /&gt;
    _state.teamsPerMatch = shiftCols(_state.teamsPerMatch, base, oldC)&lt;br /&gt;
    _state.matchgroup = {} -- recompute&lt;br /&gt;
&lt;br /&gt;
    -- Update view range: now we render 1..newC&lt;br /&gt;
    _config.c = newC&lt;br /&gt;
    _config.minc = 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Params&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/StateChecks&amp;diff=76408</id>
		<title>Module:Build bracket/StateChecks</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/StateChecks&amp;diff=76408"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local StateChecks = {}&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 1) MODULE BINDINGS&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Bound at runtime&lt;br /&gt;
local state, config, Helpers&lt;br /&gt;
&lt;br /&gt;
-- Local aliases (filled in bind; with fallbacks)&lt;br /&gt;
local isempty, notempty&lt;br /&gt;
&lt;br /&gt;
function StateChecks.bind(_state, _config, _Helpers)&lt;br /&gt;
    state, config, Helpers = _state, _config, _Helpers&lt;br /&gt;
    isempty  = (Helpers and Helpers.isempty)  or function(v) return v == nil or v == &amp;quot;&amp;quot; end&lt;br /&gt;
    notempty = (Helpers and Helpers.notempty) or function(v) return v ~= nil and v ~= &amp;quot;&amp;quot; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 2) CONTENT CHECKS&lt;br /&gt;
-- =========================&lt;br /&gt;
-- True when the entry at (col,row) is empty for rendering purposes.&lt;br /&gt;
-- For &#039;team&#039; → check team text; for &#039;text&#039; → check text; everything else counts as blank.&lt;br /&gt;
function StateChecks.isBlankEntry(col, row)&lt;br /&gt;
    local colEntries = state.entries and state.entries[col]&lt;br /&gt;
    if not colEntries then return true end&lt;br /&gt;
&lt;br /&gt;
    local e = colEntries[row]&lt;br /&gt;
    if not e then return true end&lt;br /&gt;
&lt;br /&gt;
    local ct = e.ctype&lt;br /&gt;
    if ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
        return isempty(e.team)&lt;br /&gt;
    elseif ct == &amp;quot;text&amp;quot; then&lt;br /&gt;
        return isempty(e.text)&lt;br /&gt;
    end&lt;br /&gt;
    -- headers/lines/blanks or anything else are non-content here&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 3) SEED VISIBILITY&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Show seeds when forced, when this team has a seed, or when any teammate in the same match has a seed.&lt;br /&gt;
function StateChecks.showSeeds(j, i)&lt;br /&gt;
    local col = state.entries and state.entries[j]&lt;br /&gt;
    if not col then return false end&lt;br /&gt;
&lt;br /&gt;
    local e = col[i]&lt;br /&gt;
    if not e or e.ctype ~= &amp;quot;team&amp;quot; then return false end&lt;br /&gt;
&lt;br /&gt;
    if config.forceseeds or notempty(e.seed) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local group = e.group&lt;br /&gt;
    local tpm   = state.teamsPerMatch[j] or 2&lt;br /&gt;
    if tpm &amp;lt;= 1 then return false end&lt;br /&gt;
&lt;br /&gt;
    -- Teams are laid out every 2 rows per match.&lt;br /&gt;
    local step  = 2&lt;br /&gt;
    local R     = config.r&lt;br /&gt;
&lt;br /&gt;
    local function neighborHasSeed(idx)&lt;br /&gt;
        local n = col[idx]&lt;br /&gt;
        return n and n.ctype == &amp;quot;team&amp;quot; and n.group == group and notempty(n.seed)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Check teammates forward/back within the match block&lt;br /&gt;
    for k = 1, tpm - 1 do&lt;br /&gt;
        local plus  = i + step * k&lt;br /&gt;
        local minus = i - step * k&lt;br /&gt;
        if plus  &amp;lt;= R and neighborHasSeed(plus)  then return true end&lt;br /&gt;
        if minus &amp;gt;= 1 and neighborHasSeed(minus) then return true end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 4) ROUND VISIBILITY (HIDE)&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Mutates state.hide[j][hidx] to false when content is found under a header (keeps legacy semantics).&lt;br /&gt;
&lt;br /&gt;
function StateChecks.teamLegs(j, i)&lt;br /&gt;
    local col          = state.entries and state.entries[j]&lt;br /&gt;
    local roundDefault = (state.rlegs and state.rlegs[j]) or 1&lt;br /&gt;
    if not col then return roundDefault end&lt;br /&gt;
&lt;br /&gt;
    local e = col[i]&lt;br /&gt;
    if not e or e.ctype ~= &amp;quot;team&amp;quot; then return roundDefault end&lt;br /&gt;
&lt;br /&gt;
    local legs = roundDefault&lt;br /&gt;
    if notempty(e.legs) then&lt;br /&gt;
        legs = tonumber(e.legs) or legs&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Treat nil/&#039;&#039; and strings containing &#039;nbsp&#039; as blank&lt;br /&gt;
    local function isScoreBlank(v)&lt;br /&gt;
        if isempty(v) then return true end&lt;br /&gt;
        return type(v) == &amp;quot;string&amp;quot; and v:find(&amp;quot;nbsp&amp;quot;, 1, true) ~= nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.autolegs and e.score then&lt;br /&gt;
        local l = 1&lt;br /&gt;
        while not isScoreBlank(e.score[l]) do&lt;br /&gt;
            l = l + 1&lt;br /&gt;
        end&lt;br /&gt;
        local inferred = l - 1&lt;br /&gt;
        if inferred &amp;gt; 0 then&lt;br /&gt;
            legs = inferred&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return legs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 6) ROUND CONTENT CHECK&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Used for &#039;byes&#039; detection: true when there is no content until the next header (or end).&lt;br /&gt;
function StateChecks.roundIsEmpty(j, i)&lt;br /&gt;
    local col = state.entries and state.entries[j]&lt;br /&gt;
    if not col then return true end&lt;br /&gt;
&lt;br /&gt;
    local row, R = i + 1, config.r&lt;br /&gt;
    while row &amp;lt;= R do&lt;br /&gt;
        local e = col[row]&lt;br /&gt;
        if e and e.ctype == &amp;quot;header&amp;quot; then break end&lt;br /&gt;
        if not StateChecks.isBlankEntry(j, row) then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
        row = row + 1&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 7) DEFAULT HEADER TEXT&lt;br /&gt;
-- =========================&lt;br /&gt;
-- Default header text when none provided (keeps legacy strings).&lt;br /&gt;
function StateChecks.defaultHeaderText(j, headerindex)&lt;br /&gt;
    if headerindex ~= 1 then&lt;br /&gt;
        return &amp;quot;Lower round &amp;quot; .. tostring(j)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local base    = config.base or 0&lt;br /&gt;
    local orig_j  = j + base&lt;br /&gt;
    local total   = config.c_total or (config.c + base)&lt;br /&gt;
    local rem     = total - orig_j&lt;br /&gt;
&lt;br /&gt;
    if rem == 0 then&lt;br /&gt;
        return &amp;quot;Final&amp;quot;&lt;br /&gt;
    elseif rem == 1 then&lt;br /&gt;
        return &amp;quot;Semifinals&amp;quot;&lt;br /&gt;
    elseif rem == 2 then&lt;br /&gt;
        return &amp;quot;Quarterfinals&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;Round &amp;quot; .. tostring(orig_j)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 8) PATH PRESENCE CHECK&lt;br /&gt;
-- =========================&lt;br /&gt;
-- True when the path block between j → j+1 at row i has no visible lines at all.&lt;br /&gt;
function StateChecks.noPaths(j, i)&lt;br /&gt;
    local hasCross = state.hascross and state.hascross[j]&lt;br /&gt;
    local cols     = hasCross and 3 or 2&lt;br /&gt;
&lt;br /&gt;
    -- Path cells: any nonzero border means a path&lt;br /&gt;
    local pcj = state.pathCell and state.pathCell[j]&lt;br /&gt;
    local pci = pcj and pcj[i]&lt;br /&gt;
    if pci then&lt;br /&gt;
        for k = 1, cols do&lt;br /&gt;
            local edges = pci[k] and pci[k][1]&lt;br /&gt;
            if edges and (&lt;br /&gt;
                (edges[1] and edges[1] ~= 0) or&lt;br /&gt;
                (edges[2] and edges[2] ~= 0) or&lt;br /&gt;
                (edges[3] and edges[3] ~= 0) or&lt;br /&gt;
                (edges[4] and edges[4] ~= 0)&lt;br /&gt;
            ) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Cross cells: left/right flag at index 1 means a cross path&lt;br /&gt;
    if hasCross then&lt;br /&gt;
        local ccj = state.crossCell and state.crossCell[j]&lt;br /&gt;
        local cci = ccj and ccj[i]&lt;br /&gt;
        if cci then&lt;br /&gt;
            local left, right = cci.left, cci.right&lt;br /&gt;
            if (left and left[1] == 1) or (right and right[1] == 1) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return StateChecks&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Render&amp;diff=76406</id>
		<title>Module:Build bracket/Render</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Render&amp;diff=76406"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Render = {}&lt;br /&gt;
&lt;br /&gt;
-- ================================&lt;br /&gt;
-- 1) MODULE STATE &amp;amp; BIND INJECTS&lt;br /&gt;
-- ================================&lt;br /&gt;
-- Upvalues bound in buildTable(...)&lt;br /&gt;
local state, config, Helpers, StateChecks&lt;br /&gt;
&lt;br /&gt;
-- Local stdlib aliases&lt;br /&gt;
local t_insert = table.insert&lt;br /&gt;
&lt;br /&gt;
-- Helper/function locals (set during bind)&lt;br /&gt;
local isempty, notempty, cellBorder, unboldParenthetical&lt;br /&gt;
local showSeeds, teamLegs, roundIsEmpty, defaultHeaderText, isBlankEntry&lt;br /&gt;
&lt;br /&gt;
-- =========================&lt;br /&gt;
-- 2) CORE &amp;lt;td&amp;gt; CONSTRUCTOR&lt;br /&gt;
-- =========================&lt;br /&gt;
local function Cell(tbl, j, i, opts)&lt;br /&gt;
    opts = opts or {}&lt;br /&gt;
    local cell = tbl:tag(&amp;quot;td&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- classes/attributes&lt;br /&gt;
    if opts.classes then&lt;br /&gt;
        for _, c in ipairs(opts.classes) do&lt;br /&gt;
            cell:addClass(c)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if opts.colspan and opts.colspan ~= 1 then&lt;br /&gt;
        cell:attr(&amp;quot;colspan&amp;quot;, opts.colspan)&lt;br /&gt;
    end&lt;br /&gt;
    if opts.rowspan and opts.rowspan ~= 1 then&lt;br /&gt;
        cell:attr(&amp;quot;rowspan&amp;quot;, opts.rowspan)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- styling&lt;br /&gt;
    if opts.borderWidth then&lt;br /&gt;
        cell:css(&amp;quot;border-width&amp;quot;, cellBorder(opts.borderWidth))&lt;br /&gt;
    end&lt;br /&gt;
    if opts.weight == &amp;quot;bold&amp;quot; then&lt;br /&gt;
        cell:css(&amp;quot;font-weight&amp;quot;, &amp;quot;bold&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if opts.bg then&lt;br /&gt;
        cell:css(&amp;quot;background&amp;quot;, opts.bg)&lt;br /&gt;
    end&lt;br /&gt;
    if opts.color then&lt;br /&gt;
        cell:css(&amp;quot;color&amp;quot;, opts.color)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- alignment helpers&lt;br /&gt;
    if opts.align == &amp;quot;center&amp;quot; then&lt;br /&gt;
        cell:addClass(&amp;quot;brk-center&amp;quot;)&lt;br /&gt;
    elseif opts.align == &amp;quot;right&amp;quot; then&lt;br /&gt;
        cell:css(&amp;quot;text-align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if opts.text then&lt;br /&gt;
        cell:wikitext(opts.text)&lt;br /&gt;
    end&lt;br /&gt;
    return cell&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =====================================&lt;br /&gt;
-- 3) ENTRY SIZING (computed per-round)&lt;br /&gt;
-- =====================================&lt;br /&gt;
local entryColspan = nil&lt;br /&gt;
local function getEntryColspan(j)&lt;br /&gt;
    return entryColspan and entryColspan[j] or 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==========================&lt;br /&gt;
-- 4) TEAM / SCORE CELLS&lt;br /&gt;
-- ==========================&lt;br /&gt;
local function teamCell(tbl, k, j, i, l, colspan)&lt;br /&gt;
    local classes = {&amp;quot;brk-td&amp;quot;, &amp;quot;brk-b&amp;quot;, (k == &amp;quot;seed&amp;quot;) and &amp;quot;brk-bgD&amp;quot; or &amp;quot;brk-bgL&amp;quot;}&lt;br /&gt;
    if k == &amp;quot;seed&amp;quot; or k == &amp;quot;score&amp;quot; then&lt;br /&gt;
        classes[#classes + 1] = &amp;quot;brk-center&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- strict bolding&lt;br /&gt;
    local weightFlag&lt;br /&gt;
    if k == &amp;quot;team&amp;quot; then&lt;br /&gt;
        if state.entries[j][i].weight == &amp;quot;bold&amp;quot; then&lt;br /&gt;
            weightFlag = &amp;quot;bold&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    elseif k == &amp;quot;score&amp;quot; and l ~= nil then&lt;br /&gt;
        local sc = state.entries[j][i].score&lt;br /&gt;
        if sc and sc.weight and sc.weight[l] == &amp;quot;bold&amp;quot; then&lt;br /&gt;
            weightFlag = &amp;quot;bold&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local legs = teamLegs(j, i)&lt;br /&gt;
    local opts = {&lt;br /&gt;
        classes = classes,&lt;br /&gt;
        colspan = colspan,&lt;br /&gt;
        rowspan = 2,&lt;br /&gt;
        borderWidth = {0, 0, 1, 1},&lt;br /&gt;
        weight = weightFlag -- &#039;bold&#039; or nil&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- borders&lt;br /&gt;
    if k == &amp;quot;team&amp;quot; and legs == 0 then&lt;br /&gt;
        opts.borderWidth[2] = 1&lt;br /&gt;
    end&lt;br /&gt;
    if state.entries[j][i].position == &amp;quot;top&amp;quot; then&lt;br /&gt;
        opts.borderWidth[1] = 1&lt;br /&gt;
    end&lt;br /&gt;
    if l == legs or l == &amp;quot;agg&amp;quot; or k == &amp;quot;seed&amp;quot; then&lt;br /&gt;
        opts.borderWidth[2] = 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- text&lt;br /&gt;
    local function tostr(x)&lt;br /&gt;
        return (x == nil) and &amp;quot;&amp;quot; or tostring(x)&lt;br /&gt;
    end&lt;br /&gt;
    if l == nil then&lt;br /&gt;
        opts.text = unboldParenthetical(tostr(state.entries[j][i][k]))&lt;br /&gt;
    else&lt;br /&gt;
        local v = state.entries[j][i][k] and state.entries[j][i][k][l]&lt;br /&gt;
        opts.text = tostr(v)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- ensure seeds inherit team bold without affecting score logic&lt;br /&gt;
    if k == &amp;quot;seed&amp;quot; and state.entries[j][i] and state.entries[j][i].weight == &amp;quot;bold&amp;quot; then&lt;br /&gt;
        opts.weight = opts.weight or &amp;quot;bold&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return Cell(tbl, j, i, opts)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ======================================&lt;br /&gt;
-- 5) NIL/BLANK ENTRY HANDLING PER CELL&lt;br /&gt;
-- ======================================&lt;br /&gt;
local function handleEmptyOrNilEntry(tbl, j, i, R)&lt;br /&gt;
    local entry_colspan = getEntryColspan(j)&lt;br /&gt;
    local col = state.entries[j] or {}&lt;br /&gt;
&lt;br /&gt;
    -- nil entry: optionally emit spanning blank to keep grid intact&lt;br /&gt;
    if col[i] == nil then&lt;br /&gt;
        if col[i - 1] ~= nil or i == 1 then&lt;br /&gt;
            local rowspan, row = 0, i&lt;br /&gt;
            repeat&lt;br /&gt;
                rowspan = rowspan + 1&lt;br /&gt;
                row = row + 1&lt;br /&gt;
            until col[row] ~= nil or row &amp;gt; R&lt;br /&gt;
            Cell(tbl, j, i, {rowspan = rowspan, colspan = entry_colspan})&lt;br /&gt;
            return true&lt;br /&gt;
        else&lt;br /&gt;
            return true -- intentionally omitted cell&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if col[i][&amp;quot;ctype&amp;quot;] == &amp;quot;blank&amp;quot; then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============================&lt;br /&gt;
-- 6) ENTRY INSERTORS (ctype)&lt;br /&gt;
-- ============================&lt;br /&gt;
-- 6.1 Header&lt;br /&gt;
local function insertHeader(tbl, j, i, entry)&lt;br /&gt;
    local byesJ = state.byes[j]&lt;br /&gt;
    local hideJ = state.hide[j]&lt;br /&gt;
    local entry_colspan = getEntryColspan(j)&lt;br /&gt;
&lt;br /&gt;
    if (byesJ and byesJ[entry.headerindex] and roundIsEmpty(j, i)) or (hideJ and hideJ[entry.headerindex]) then&lt;br /&gt;
        return Cell(tbl, j, i, {rowspan = 2, colspan = entry_colspan})&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if isempty(entry.header) then&lt;br /&gt;
        entry.header = defaultHeaderText(j, entry.headerindex)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local classes = {&amp;quot;brk-td&amp;quot;, &amp;quot;brk-b&amp;quot;, &amp;quot;brk-center&amp;quot;}&lt;br /&gt;
    local useCustomShade = entry.shade_is_rd and not isempty(entry.shade)&lt;br /&gt;
    if not useCustomShade then&lt;br /&gt;
        t_insert(classes, &amp;quot;brk-bgD&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local cellOpts = {&lt;br /&gt;
        rowspan = 2,&lt;br /&gt;
        colspan = entry_colspan,&lt;br /&gt;
        text = entry.header,&lt;br /&gt;
        classes = classes,&lt;br /&gt;
        borderWidth = {1, 1, 1, 1}&lt;br /&gt;
    }&lt;br /&gt;
    if useCustomShade then&lt;br /&gt;
        cellOpts.bg = entry.shade&lt;br /&gt;
    end&lt;br /&gt;
    return Cell(tbl, j, i, cellOpts)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 6.2 Team (+seed/+scores/+agg)&lt;br /&gt;
local function insertTeam(tbl, j, i, entry)&lt;br /&gt;
    local byesJ = state.byes[j]&lt;br /&gt;
    local hideJ = state.hide[j]&lt;br /&gt;
    local entry_colspan = getEntryColspan(j)&lt;br /&gt;
    local maxlegs = state.maxlegs[j] or 1&lt;br /&gt;
    local legs = teamLegs(j, i)&lt;br /&gt;
    local team_colspan = maxlegs - legs + 1&lt;br /&gt;
&lt;br /&gt;
    -- bye/hidden → reserve footprint&lt;br /&gt;
    if ((byesJ and byesJ[entry.headerindex]) and isBlankEntry(j, i)) or (hideJ and hideJ[entry.headerindex]) then&lt;br /&gt;
        return Cell(tbl, j, i, {rowspan = 2, colspan = entry_colspan})&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if config.aggregate and legs == 1 and maxlegs &amp;gt; 1 then&lt;br /&gt;
        team_colspan = team_colspan + 1&lt;br /&gt;
    end&lt;br /&gt;
    if maxlegs == 0 then&lt;br /&gt;
        team_colspan = team_colspan + 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- seed&lt;br /&gt;
    if config.seeds then&lt;br /&gt;
        if showSeeds(j, i) == true then&lt;br /&gt;
            teamCell(tbl, &amp;quot;seed&amp;quot;, j, i)&lt;br /&gt;
        else&lt;br /&gt;
            team_colspan = team_colspan + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- team name&lt;br /&gt;
    teamCell(tbl, &amp;quot;team&amp;quot;, j, i, nil, team_colspan)&lt;br /&gt;
&lt;br /&gt;
    -- scores&lt;br /&gt;
    for l = 1, legs do&lt;br /&gt;
        teamCell(tbl, &amp;quot;score&amp;quot;, j, i, l)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- aggregate&lt;br /&gt;
    if config.aggregate and legs &amp;gt; 1 then&lt;br /&gt;
        teamCell(tbl, &amp;quot;score&amp;quot;, j, i, &amp;quot;agg&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 6.3 Text&lt;br /&gt;
local function insertText(tbl, j, i, entry)&lt;br /&gt;
    Cell(tbl, j, i, {rowspan = 2, colspan = getEntryColspan(j), text = entry.text})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 6.4 Group (spans columns)&lt;br /&gt;
local function insertGroup(tbl, j, i, entry)&lt;br /&gt;
    local span = state.entries[j][i].colspan or 1&lt;br /&gt;
    local colspan = 0&lt;br /&gt;
&lt;br /&gt;
    -- sum entry widths per column&lt;br /&gt;
    for m = j, j + span - 1 do&lt;br /&gt;
        colspan = colspan + state.maxlegs[m] + 2&lt;br /&gt;
        if not config.seeds then&lt;br /&gt;
            colspan = colspan - 1&lt;br /&gt;
        end&lt;br /&gt;
        if (config.aggregate and state.maxlegs[m] &amp;gt; 1) or state.maxlegs[m] == 0 then&lt;br /&gt;
            colspan = colspan + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- add path columns between rounds&lt;br /&gt;
    for m = j, j + span - 2 do&lt;br /&gt;
        colspan = colspan + (state.hascross[m] and 3 or 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return Cell(tbl, j, i, {rowspan = 2, colspan = colspan, classes = {&amp;quot;brk-center&amp;quot;}, text = entry.group or &amp;quot;&amp;quot;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 6.5 Line&lt;br /&gt;
local function insertLine(tbl, j, i, entry)&lt;br /&gt;
    local entry_colspan = getEntryColspan(j)&lt;br /&gt;
&lt;br /&gt;
    local borderWidth = {0, 0, 0, 0}&lt;br /&gt;
    if entry.borderWidth then&lt;br /&gt;
        borderWidth = entry.borderWidth&lt;br /&gt;
    else&lt;br /&gt;
        -- derive from left path column&lt;br /&gt;
        local wantTop = entry.border == &amp;quot;top&amp;quot; or entry.border == &amp;quot;both&amp;quot;&lt;br /&gt;
        local wantBottom = (entry.border == nil) or entry.border == &amp;quot;bottom&amp;quot; or entry.border == &amp;quot;both&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if wantBottom and state.pathCell[j - 1] and state.pathCell[j - 1][i + 1] then&lt;br /&gt;
            borderWidth[3] = 2 * (state.pathCell[j - 1][i + 1][3][1][3] or 0)&lt;br /&gt;
        end&lt;br /&gt;
        if wantTop and state.pathCell[j - 1] and state.pathCell[j - 1][i] then&lt;br /&gt;
            borderWidth[1] = 2 * (state.pathCell[j - 1][i][3][1][1] or 0)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local cell = Cell(tbl, j, i, {rowspan = 2, colspan = entry_colspan, text = entry.text, borderWidth = borderWidth})&lt;br /&gt;
    cell:addClass(&amp;quot;brk-line&amp;quot;)&lt;br /&gt;
    if entry.color then&lt;br /&gt;
        cell:css(&amp;quot;border-color&amp;quot;, entry.color)&lt;br /&gt;
    end&lt;br /&gt;
    return cell&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local INSERTORS = {&lt;br /&gt;
    header = insertHeader,&lt;br /&gt;
    team = insertTeam,&lt;br /&gt;
    text = insertText,&lt;br /&gt;
    group = insertGroup,&lt;br /&gt;
    line = insertLine&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function insertEntry(tbl, j, i, R)&lt;br /&gt;
    if handleEmptyOrNilEntry(tbl, j, i, R) then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    local entry = state.entries[j][i]&lt;br /&gt;
    if not entry then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    local fn = INSERTORS[entry.ctype]&lt;br /&gt;
    if fn then&lt;br /&gt;
        return fn(tbl, j, i, entry)&lt;br /&gt;
    end&lt;br /&gt;
    return Cell(tbl, j, i, {rowspan = 2, colspan = getEntryColspan(j)})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===================================&lt;br /&gt;
-- 7) PATH CELL EMITTERS (between RDs)&lt;br /&gt;
-- ===================================&lt;br /&gt;
-- Always emit the correct number of &amp;lt;td&amp;gt;s:&lt;br /&gt;
-- - 2 lanes when no cross (k=1,3)&lt;br /&gt;
-- - 3 lanes when cross (k=1,2,3). The center lane (k=2) is skipped only if no cross.&lt;br /&gt;
local function generatePathCell(tbl, j, i, k, bg, rowspan)&lt;br /&gt;
    if not state.hascross[j] and k == 2 then&lt;br /&gt;
        return&lt;br /&gt;
    end -- keep table aligned&lt;br /&gt;
&lt;br /&gt;
    local colData = state.pathCell[j][i][k]&lt;br /&gt;
    local borders = (colData and colData[1]) or {0, 0, 0, 0}&lt;br /&gt;
    local color = (colData and colData.color) or &amp;quot;transparent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local cell = tbl:tag(&amp;quot;td&amp;quot;)&lt;br /&gt;
    if rowspan and rowspan ~= 1 then&lt;br /&gt;
        cell:attr(&amp;quot;rowspan&amp;quot;, rowspan)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if k == 2 and state.hascross[j] and notempty(bg) then&lt;br /&gt;
        cell:css(&amp;quot;background&amp;quot;, bg):css(&amp;quot;transform&amp;quot;, &amp;quot;translate(-1px)&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if borders[1] ~= 0 or borders[2] ~= 0 or borders[3] ~= 0 or borders[4] ~= 0 then&lt;br /&gt;
        cell:css(&amp;quot;border&amp;quot;, &amp;quot;solid &amp;quot; .. color):css(&lt;br /&gt;
            &amp;quot;border-width&amp;quot;,&lt;br /&gt;
            (2 * borders[1]) ..&lt;br /&gt;
                &amp;quot;px &amp;quot; .. (2 * borders[2]) .. &amp;quot;px &amp;quot; .. (2 * borders[3]) .. &amp;quot;px &amp;quot; .. (2 * borders[4]) .. &amp;quot;px&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
    return cell&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function insertPath(tbl, j, i, R)&lt;br /&gt;
    if state.skipPath[j][i] then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local colspan, rowspan = 2, 1&lt;br /&gt;
    local bg = &amp;quot;&amp;quot;&lt;br /&gt;
    local cross = {&amp;quot;&amp;quot;, &amp;quot;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
    local Pj = state.pathCell[j]&lt;br /&gt;
    local Xj = state.crossCell[j]&lt;br /&gt;
    local SPj = state.skipPath[j]&lt;br /&gt;
&lt;br /&gt;
    -- vertical merge: extend rowspan down while borders repeat identically&lt;br /&gt;
    if i &amp;lt; R then&lt;br /&gt;
        local function sameBorders(a)&lt;br /&gt;
            if a &amp;gt; R - 1 or SPj[a] then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
            local pi, pa = Pj[i], Pj[a]&lt;br /&gt;
            for k = 1, 3 do&lt;br /&gt;
                local bi, ba = pi[k][1], pa[k][1]&lt;br /&gt;
                if bi[1] ~= ba[1] or bi[2] ~= ba[2] or bi[3] ~= ba[3] or bi[4] ~= ba[4] then&lt;br /&gt;
                    return false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
        if sameBorders(i) then&lt;br /&gt;
            local row = i&lt;br /&gt;
            repeat&lt;br /&gt;
                if row ~= i and sameBorders(row) then&lt;br /&gt;
                    SPj[row] = true&lt;br /&gt;
                end&lt;br /&gt;
                rowspan = rowspan + 1&lt;br /&gt;
                row = row + 1&lt;br /&gt;
            until row &amp;gt; R or not sameBorders(row)&lt;br /&gt;
            rowspan = rowspan - 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- avoid double-emitting cross rows (previous row already spans)&lt;br /&gt;
    if&lt;br /&gt;
        i &amp;gt; 1 and Xj[i - 1] and&lt;br /&gt;
            ((Xj[i - 1].left and Xj[i - 1].left[1] == 1) or (Xj[i - 1].right and Xj[i - 1].right[1] == 1))&lt;br /&gt;
     then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- cross visuals&lt;br /&gt;
    if state.hascross[j] then&lt;br /&gt;
        colspan = 3&lt;br /&gt;
        if Xj[i].left[1] == 1 or Xj[i].right[1] == 1 then&lt;br /&gt;
            rowspan = 2&lt;br /&gt;
            if Xj[i].left[1] == 1 then&lt;br /&gt;
                cross[1] =&lt;br /&gt;
                    &amp;quot;linear-gradient(to top right, transparent calc(50% - 1px),&amp;quot; ..&lt;br /&gt;
                    Xj[i].left[2] ..&lt;br /&gt;
                        &amp;quot; calc(50% - 1px),&amp;quot; .. Xj[i].left[2] .. &amp;quot; calc(50% + 1px), transparent calc(50% + 1px))&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            if Xj[i].right[1] == 1 then&lt;br /&gt;
                cross[2] =&lt;br /&gt;
                    &amp;quot;linear-gradient(to bottom right, transparent calc(50% - 1px),&amp;quot; ..&lt;br /&gt;
                    Xj[i].right[2] ..&lt;br /&gt;
                        &amp;quot; calc(50% - 1px),&amp;quot; .. Xj[i].right[2] .. &amp;quot; calc(50% + 1px), transparent calc(50% + 1px))&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if notempty(cross[1]) and notempty(cross[2]) then&lt;br /&gt;
            cross[1] = cross[1] .. &amp;quot;,&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        bg = cross[1] .. cross[2]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- emit L | (CENTER) | R cells&lt;br /&gt;
    for k = 1, 3 do&lt;br /&gt;
        generatePathCell(tbl, j, i, k, bg, rowspan)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =========================================&lt;br /&gt;
-- 8) INVISIBLE SCAFFOLDING (LEGACY COMPAT)&lt;br /&gt;
-- =========================================&lt;br /&gt;
local function emitRowHeight(tr, rowHeightPx) -- left height cell per data row&lt;br /&gt;
    tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;height&amp;quot;, rowHeightPx)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- widths row: fixes widths for seed/team/score(+agg) and path columns&lt;br /&gt;
local function emitWidthsRow(tbl, MINC, C, seedW, teamW, scoreW, aggW, pathW, leftPad, rightPad, crossW, crossPad)&lt;br /&gt;
    tbl:tag(&amp;quot;tr&amp;quot;):css(&amp;quot;visibility&amp;quot;, &amp;quot;collapse&amp;quot;) -- spacer&lt;br /&gt;
&lt;br /&gt;
    local tr = tbl:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
    tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, &amp;quot;1px&amp;quot;) -- tiny leading gutter&lt;br /&gt;
&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        if config.seeds then&lt;br /&gt;
            tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, seedW)&lt;br /&gt;
        end&lt;br /&gt;
        tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, teamW)&lt;br /&gt;
&lt;br /&gt;
        local maxlegs = (state.maxlegs and state.maxlegs[j]) or 1&lt;br /&gt;
        if maxlegs &amp;lt;= 0 then&lt;br /&gt;
            tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, scoreW) -- legacy extra column when maxlegs == 0&lt;br /&gt;
        else&lt;br /&gt;
            for _ = 1, maxlegs do&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, scoreW)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if config.aggregate and maxlegs &amp;gt; 1 then&lt;br /&gt;
            tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, aggW)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if j &amp;lt; C then&lt;br /&gt;
            if state.hascross and state.hascross[j] then&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, pathW):css(&amp;quot;padding-left&amp;quot;, leftPad) -- L&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, crossW):css(&amp;quot;padding-left&amp;quot;, crossPad) -- CENTER&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, pathW):css(&amp;quot;padding-right&amp;quot;, rightPad) -- R&lt;br /&gt;
            else&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, pathW):css(&amp;quot;padding-left&amp;quot;, leftPad) -- L&lt;br /&gt;
                tr:tag(&amp;quot;td&amp;quot;):css(&amp;quot;width&amp;quot;, pathW):css(&amp;quot;padding-right&amp;quot;, rightPad) -- R&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============================&lt;br /&gt;
-- 9) PUBLIC: BUILD THE TABLE&lt;br /&gt;
-- ==============================&lt;br /&gt;
function Render.buildTable(frame, _state, _config, _Helpers, _StateChecks)&lt;br /&gt;
    -- Bind upvalues&lt;br /&gt;
    state, config, Helpers, StateChecks = _state, _config, _Helpers, _StateChecks&lt;br /&gt;
&lt;br /&gt;
    -- Helpers&lt;br /&gt;
    isempty, notempty = Helpers.isempty, Helpers.notempty&lt;br /&gt;
    cellBorder = Helpers.cellBorder&lt;br /&gt;
    unboldParenthetical = Helpers.unboldParenthetical&lt;br /&gt;
&lt;br /&gt;
    -- State checks&lt;br /&gt;
    showSeeds = StateChecks.showSeeds&lt;br /&gt;
    teamLegs = StateChecks.teamLegs&lt;br /&gt;
    roundIsEmpty = StateChecks.roundIsEmpty&lt;br /&gt;
    defaultHeaderText = StateChecks.defaultHeaderText&lt;br /&gt;
    isBlankEntry = StateChecks.isBlankEntry&lt;br /&gt;
&lt;br /&gt;
    -- Hot locals&lt;br /&gt;
    local MINC, C = config.minc, config.c&lt;br /&gt;
    local R0 = tonumber(config.r) or 0&lt;br /&gt;
    local entries = state.entries&lt;br /&gt;
    local pathCell = state.pathCell&lt;br /&gt;
    local crossCell = state.crossCell&lt;br /&gt;
    local hide = state.hide or {}&lt;br /&gt;
    local byes = state.byes or {}&lt;br /&gt;
    local maxlegsArr = state.maxlegs or {}&lt;br /&gt;
    local hascross = state.hascross or {}&lt;br /&gt;
&lt;br /&gt;
    -- Respect explicit |rows=|&lt;br /&gt;
    local userRowsArg = config._fargs and config._fargs.rows&lt;br /&gt;
&lt;br /&gt;
    -- Is this entry visibly rendered&lt;br /&gt;
    local function entryIsVisible(j, i)&lt;br /&gt;
        local col = entries[j]&lt;br /&gt;
        local e = col and col[i]&lt;br /&gt;
        if not e then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local ct = e.ctype&lt;br /&gt;
        local hidx = e.headerindex&lt;br /&gt;
        local hid = (hide[j] and hide[j][hidx]) or false&lt;br /&gt;
        if hid then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if ct == &amp;quot;team&amp;quot; then&lt;br /&gt;
            local bye = (byes[j] and byes[j][hidx]) or false&lt;br /&gt;
            if bye and isBlankEntry(j, i) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
            return true&lt;br /&gt;
        elseif ct == &amp;quot;header&amp;quot; then&lt;br /&gt;
            local bye = (byes[j] and byes[j][hidx]) or false&lt;br /&gt;
            if bye and roundIsEmpty(j, i) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
            return true -- header shows (defaults applied) unless hidden or bye+empty&lt;br /&gt;
        elseif ct == &amp;quot;text&amp;quot; then&lt;br /&gt;
            return notempty(e.text)&lt;br /&gt;
        elseif ct == &amp;quot;group&amp;quot; then&lt;br /&gt;
            return notempty(e.group)&lt;br /&gt;
        elseif ct == &amp;quot;line&amp;quot; then&lt;br /&gt;
            -- Count visible borders via path scan, not the placeholder cell itself&lt;br /&gt;
            return notempty(e.text) -- only count if it actually prints text&lt;br /&gt;
        end&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Backward scan for last visually-used row (entries or painted paths)&lt;br /&gt;
    local function computeBottomUsedRow(R)&lt;br /&gt;
        for i = R, 1, -1 do&lt;br /&gt;
            -- Any visible entry on this row?&lt;br /&gt;
            for j = MINC, C do&lt;br /&gt;
                if entryIsVisible(j, i) then&lt;br /&gt;
                    local e = entries[j][i]&lt;br /&gt;
                    -- teams occupy a row pair → include the following row if within bounds&lt;br /&gt;
                    if e.ctype == &amp;quot;team&amp;quot; then&lt;br /&gt;
                        return (i + 1 &amp;lt;= R) and (i + 1) or i&lt;br /&gt;
                    else&lt;br /&gt;
                        return i&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Any path/cross on this row?&lt;br /&gt;
            for j = MINC, C - 1 do&lt;br /&gt;
                local Pj = pathCell[j]&lt;br /&gt;
                local Xj = crossCell[j]&lt;br /&gt;
&lt;br /&gt;
                -- Cross uses a row pair&lt;br /&gt;
                local cc = Xj and Xj[i]&lt;br /&gt;
                if cc and ((cc.left and cc.left[1] == 1) or (cc.right and cc.right[1] == 1)) then&lt;br /&gt;
                    return (i + 1 &amp;lt;= R) and (i + 1) or i&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                -- Any nonzero border on any lane?&lt;br /&gt;
                local row = Pj and Pj[i]&lt;br /&gt;
                if row then&lt;br /&gt;
                    for k = 1, 3 do&lt;br /&gt;
                        local cell = row[k]&lt;br /&gt;
                        local b = cell and cell[1]&lt;br /&gt;
                        if b and ((b[1] or 0) ~= 0 or (b[2] or 0) ~= 0 or (b[3] or 0) ~= 0 or (b[4] or 0) ~= 0) then&lt;br /&gt;
                            return i&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return 1 -- nothing visible; keep at least one row&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Effective number of data rows to emit&lt;br /&gt;
    local R_eff = (userRowsArg and userRowsArg ~= &amp;quot;&amp;quot;) and R0 or computeBottomUsedRow(R0)&lt;br /&gt;
&lt;br /&gt;
    -- Precompute entryColspan per round&lt;br /&gt;
    entryColspan = {}&lt;br /&gt;
    for j = MINC, C do&lt;br /&gt;
        local ml = maxlegsArr[j] or 1&lt;br /&gt;
        local col = ml + 2&lt;br /&gt;
        if not config.seeds then&lt;br /&gt;
            col = col - 1&lt;br /&gt;
        end&lt;br /&gt;
        if (config.aggregate and ml &amp;gt; 1) or ml == 0 then&lt;br /&gt;
            col = col + 1&lt;br /&gt;
        end&lt;br /&gt;
        entryColspan[j] = col&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Table skeleton&lt;br /&gt;
    local tbl = mw.html.create(&amp;quot;table&amp;quot;):addClass(&amp;quot;brk&amp;quot;)&lt;br /&gt;
    if config.nowrap then&lt;br /&gt;
        tbl:addClass(&amp;quot;brk-nw&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Fixed internal row height (do NOT use config.height here)&lt;br /&gt;
    local rowHeightPx = &amp;quot;11px&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- Column widths (resolve once)&lt;br /&gt;
    local getWidth = Helpers.getWidth&lt;br /&gt;
    local seedW = (getWidth and getWidth(&amp;quot;seed&amp;quot;, &amp;quot;25px&amp;quot;)) or &amp;quot;25px&amp;quot;&lt;br /&gt;
    local teamW = (getWidth and getWidth(&amp;quot;team&amp;quot;, &amp;quot;150px&amp;quot;)) or &amp;quot;150px&amp;quot;&lt;br /&gt;
    local scoreW = (getWidth and getWidth(&amp;quot;score&amp;quot;, &amp;quot;25px&amp;quot;)) or &amp;quot;25px&amp;quot;&lt;br /&gt;
    local aggRaw = (getWidth and getWidth(&amp;quot;agg&amp;quot;, nil)) or nil&lt;br /&gt;
    local aggW = Helpers.isempty(aggRaw) and scoreW or aggRaw&lt;br /&gt;
    local pathW = &amp;quot;2px&amp;quot;&lt;br /&gt;
    local crossW = (getWidth and getWidth(&amp;quot;cross&amp;quot;, &amp;quot;5px&amp;quot;)) or &amp;quot;5px&amp;quot;&lt;br /&gt;
    local crossPad = (getWidth and getWidth(&amp;quot;crosspad&amp;quot;, &amp;quot;5px&amp;quot;)) or &amp;quot;5px&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- between-round spacing split (e.g., 6 → 4px left, 2px right)&lt;br /&gt;
    local spacing = tonumber(config.colspacing) or 6&lt;br /&gt;
    local leftFrac = math.floor(spacing * 2 / 3)&lt;br /&gt;
    local leftPad, rightPad = (leftFrac .. &amp;quot;px&amp;quot;), ((spacing - leftFrac) .. &amp;quot;px&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- widths row&lt;br /&gt;
    emitWidthsRow(tbl, MINC, C, seedW, teamW, scoreW, aggW, pathW, leftPad, rightPad, crossW, crossPad)&lt;br /&gt;
&lt;br /&gt;
    -- Data rows&lt;br /&gt;
    for i = 1, R_eff do&lt;br /&gt;
        local tr = tbl:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
        emitRowHeight(tr, rowHeightPx) -- left height cell&lt;br /&gt;
&lt;br /&gt;
        for j = MINC, C do&lt;br /&gt;
            insertEntry(tr, j, i, R_eff)&lt;br /&gt;
            if j &amp;lt; C then&lt;br /&gt;
                insertPath(tr, j, i, R_eff)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Wrap with a div that loads TemplateStyles and enables scroll overflow&lt;br /&gt;
    local fr = frame or mw.getCurrentFrame()&lt;br /&gt;
    local container = mw.html.create(&amp;quot;div&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- Height now applies to container (numbers → px; units respected)&lt;br /&gt;
    local containerHeight = Helpers.toCssLength(config.height, nil)&lt;br /&gt;
    if containerHeight then&lt;br /&gt;
        container:css(&amp;quot;max-height&amp;quot;, containerHeight)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    container:css(&amp;quot;overflow-x&amp;quot;, &amp;quot;auto&amp;quot;):css(&amp;quot;overflow-y&amp;quot;, &amp;quot;auto&amp;quot;)&lt;br /&gt;
    container:wikitext(fr:extensionTag(&amp;quot;templatestyles&amp;quot;, &amp;quot;&amp;quot;, {src = &amp;quot;Module:Build bracket/styles.css&amp;quot;}))&lt;br /&gt;
    container:node(tbl)&lt;br /&gt;
&lt;br /&gt;
    return tostring(container)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============&lt;br /&gt;
-- 10) EXPORTS&lt;br /&gt;
-- ============&lt;br /&gt;
return Render&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Helpers&amp;diff=76404</id>
		<title>Module:Build bracket/Helpers</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Helpers&amp;diff=76404"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Helpers = {}&lt;br /&gt;
&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 1) ARG ACCESS / BARGS WIRING&lt;br /&gt;
-- ====================================&lt;br /&gt;
local _bargs = nil&lt;br /&gt;
&lt;br /&gt;
function Helpers.setBargs(fn)&lt;br /&gt;
    _bargs = fn&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- If Config.init doesn&#039;t call this, Helpers installs fallbacks below.&lt;br /&gt;
function Helpers.installArgAccessors(fargs, pargs)&lt;br /&gt;
    Helpers.getFArg = function(k) return fargs[k] end&lt;br /&gt;
    Helpers.getPArg = function(k) return pargs[k] end&lt;br /&gt;
    Helpers.bargs   = function(k)&lt;br /&gt;
        local v = pargs[k]&lt;br /&gt;
        if v == nil or v == &amp;quot;&amp;quot; then v = fargs[k] end&lt;br /&gt;
        return v&lt;br /&gt;
    end&lt;br /&gt;
    Helpers.setBargs(Helpers.bargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Default bargs (so unit tests don’t explode without Config.init)&lt;br /&gt;
Helpers.bargs = function(key)&lt;br /&gt;
    if _bargs then return _bargs(key) end&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 2) BASIC CHECKS &amp;amp; YES/NO PARSERS&lt;br /&gt;
-- ====================================&lt;br /&gt;
function Helpers.isempty(s) return s == nil or s == &amp;quot;&amp;quot; end&lt;br /&gt;
function Helpers.notempty(s) return s ~= nil and s ~= &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
-- tolerant, case-insensitive&lt;br /&gt;
function Helpers.yes(val)&lt;br /&gt;
    if val == nil then return false end&lt;br /&gt;
    val = tostring(val):lower()&lt;br /&gt;
    return val == &amp;quot;y&amp;quot; or val == &amp;quot;yes&amp;quot; or val == &amp;quot;true&amp;quot; or val == &amp;quot;1&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
function Helpers.no(val)&lt;br /&gt;
    if val == nil then return false end&lt;br /&gt;
    val = tostring(val):lower()&lt;br /&gt;
    return val == &amp;quot;n&amp;quot; or val == &amp;quot;no&amp;quot; or val == &amp;quot;false&amp;quot; or val == &amp;quot;0&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 3) STRING HELPERS&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 1 -&amp;gt; &#039;a&#039;, 2 -&amp;gt; &#039;b&#039;, ...; wraps beyond 26; clamps nil/invalid to &#039;a&#039;&lt;br /&gt;
function Helpers.toChar(num)&lt;br /&gt;
    num = tonumber(num) or 1&lt;br /&gt;
    if num &amp;lt; 1 then num = 1 end&lt;br /&gt;
    -- wrap to 1..26 to avoid errors if headers exceed 26&lt;br /&gt;
    num = ((num - 1) % 26) + 1&lt;br /&gt;
    return string.char(string.byte(&amp;quot;a&amp;quot;) + num - 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Escape single characters for use inside a Lua pattern character class.&lt;br /&gt;
local function _esc_cc(ch)&lt;br /&gt;
    -- dash, caret, percent, closing bracket need escaping inside [...]&lt;br /&gt;
    if ch == &amp;quot;-&amp;quot; or ch == &amp;quot;^&amp;quot; or ch == &amp;quot;]&amp;quot; or ch == &amp;quot;%&amp;quot; then&lt;br /&gt;
        return &amp;quot;%&amp;quot; .. ch&lt;br /&gt;
    end&lt;br /&gt;
    return ch&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fast split over single-char delimiters; drops empties; optional number-cast.&lt;br /&gt;
function Helpers.split(str, delim, tonum)&lt;br /&gt;
    if Helpers.isempty(str) then return {} end&lt;br /&gt;
    local result, buf = {}, {}&lt;br /&gt;
    for i = 1, #delim do buf[#buf + 1] = _esc_cc(delim[i]) end&lt;br /&gt;
    local patt = &amp;quot;[^&amp;quot; .. table.concat(buf) .. &amp;quot;]+&amp;quot;&lt;br /&gt;
    for w in string.gmatch(str, patt) do&lt;br /&gt;
        result[#result + 1] = (tonum == true) and tonumber(w) or w&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Remove bold inside (...) and [...] while preserving wikilinks [[...]]&lt;br /&gt;
function Helpers.unboldParenthetical(text)&lt;br /&gt;
    if Helpers.isempty(text) then return text end&lt;br /&gt;
&lt;br /&gt;
    local STYLE_NORMAL = &#039;&amp;lt;span style=&amp;quot;font-weight:normal&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
    local PREFIX = &amp;quot;__WIKILINK__&amp;quot;&lt;br /&gt;
    local counter, placeholders = 0, {}&lt;br /&gt;
&lt;br /&gt;
    -- 1) Extract wikilinks to placeholders&lt;br /&gt;
    text = text:gsub(&amp;quot;%[%[(.-)%]%]&amp;quot;, function(link)&lt;br /&gt;
        counter = counter + 1&lt;br /&gt;
        local key = PREFIX .. counter .. &amp;quot;__&amp;quot;&lt;br /&gt;
        placeholders[key] = link&lt;br /&gt;
        return key&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    -- 2) Wrap balanced (...) and [...]&lt;br /&gt;
    text = text:gsub(&amp;quot;(%b())&amp;quot;, function(m) return string.format(STYLE_NORMAL, m) end)&lt;br /&gt;
               :gsub(&amp;quot;(%b[])&amp;quot;, function(m) return string.format(STYLE_NORMAL, m) end)&lt;br /&gt;
&lt;br /&gt;
    -- 3) Restore wikilinks&lt;br /&gt;
    for key, link in pairs(placeholders) do&lt;br /&gt;
        text = text:gsub(key, &amp;quot;[[&amp;quot; .. link .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 4) STYLE &amp;amp; DIMENSIONS&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- Border mask is {top, right, bottom, left}&lt;br /&gt;
function Helpers.cellBorder(b)&lt;br /&gt;
    -- assume well-formed input; callers always pass 4 numbers&lt;br /&gt;
    return b[1] .. &amp;quot;px &amp;quot; .. b[2] .. &amp;quot;px &amp;quot; .. b[3] .. &amp;quot;px &amp;quot; .. b[4] .. &amp;quot;px&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Normalize CSS length: numbers -&amp;gt; &amp;quot;Npx&amp;quot;; strings with units pass through.&lt;br /&gt;
function Helpers.toCssLength(v, defaultVal)&lt;br /&gt;
    if v == nil or v == &amp;quot;&amp;quot; then return defaultVal end&lt;br /&gt;
    local n = tonumber(v)&lt;br /&gt;
    if n then return tostring(n) .. &amp;quot;px&amp;quot; end&lt;br /&gt;
    return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Resolve widths from args with normalization &amp;amp; default&lt;br /&gt;
function Helpers.getWidth(ctype, defaultVal)&lt;br /&gt;
    local raw = Helpers.bargs(ctype .. &amp;quot;-width&amp;quot;)&lt;br /&gt;
    return Helpers.toCssLength(raw, defaultVal)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Helpers&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/Config&amp;diff=76402</id>
		<title>Module:Build bracket/Config</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/Config&amp;diff=76402"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Config = {}&lt;br /&gt;
&lt;br /&gt;
-- ====================================&lt;br /&gt;
-- 1) INIT &amp;amp; DEFENSIVE ACCESSORS&lt;br /&gt;
-- ====================================&lt;br /&gt;
function Config.init(frame, state, config, Helpers)&lt;br /&gt;
    -- Defend against nil inputs; don&#039;t mutate caller refs&lt;br /&gt;
    state   = state   or {}&lt;br /&gt;
    config  = config  or {}&lt;br /&gt;
    Helpers = Helpers or {}&lt;br /&gt;
&lt;br /&gt;
    -- Pull args from frame/parent (both optional)&lt;br /&gt;
    local fargs  = (frame and frame.args) or {}&lt;br /&gt;
    local parent = (frame and frame.getParent and frame:getParent()) or nil&lt;br /&gt;
    local pargs  = (parent and parent.args) or {}&lt;br /&gt;
&lt;br /&gt;
    -- Keep originals for debugging&lt;br /&gt;
    config._fargs, config._pargs = fargs, pargs&lt;br /&gt;
&lt;br /&gt;
    -- Install arg accessors (use provided installer if present)&lt;br /&gt;
    if Helpers.installArgAccessors then&lt;br /&gt;
        Helpers.installArgAccessors(fargs, pargs)&lt;br /&gt;
    else&lt;br /&gt;
        Helpers.getFArg = function(k) return fargs[k] end&lt;br /&gt;
        Helpers.getPArg = function(k) return pargs[k] end&lt;br /&gt;
        Helpers.bargs   = function(k)&lt;br /&gt;
            local v = pargs[k]&lt;br /&gt;
            if v == nil or v == &amp;quot;&amp;quot; then v = fargs[k] end&lt;br /&gt;
            return v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Short aliases&lt;br /&gt;
    local bargs   = Helpers.bargs&lt;br /&gt;
    local getFArg = Helpers.getFArg&lt;br /&gt;
    local getPArg = Helpers.getPArg&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 2) YES/NO FALLBACKS (robust parsing)&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    local function yesish(s)&lt;br /&gt;
        s = (s or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        return s == &amp;quot;y&amp;quot; or s == &amp;quot;yes&amp;quot; or s == &amp;quot;true&amp;quot; or s == &amp;quot;1&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    local function noish(s)&lt;br /&gt;
        s = (s or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        return s == &amp;quot;n&amp;quot; or s == &amp;quot;no&amp;quot; or s == &amp;quot;false&amp;quot; or s == &amp;quot;0&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Prefer Helpers.yes/no if provided; fall back to yesish/noish&lt;br /&gt;
    local YES = Helpers.yes or yesish&lt;br /&gt;
    local NO  = Helpers.no  or noish&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 3) CORE DIMENSIONS &amp;amp; CLAMPING&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- Rows: keep &#039;&#039; sentinel when user didn’t set |rows=|&lt;br /&gt;
    config.r = tonumber(getFArg(&amp;quot;rows&amp;quot;)) or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- Rounds: {{#invoke:..|rounds=}} with optional parent override maxround(s)&lt;br /&gt;
    local rounds_f = tonumber(getFArg(&amp;quot;rounds&amp;quot;)) or 1&lt;br /&gt;
    local maxc     = tonumber(getPArg(&amp;quot;maxrounds&amp;quot;)) or tonumber(getPArg(&amp;quot;maxround&amp;quot;)) or nil&lt;br /&gt;
&lt;br /&gt;
    config.c = (type(maxc) == &amp;quot;number&amp;quot;) and maxc or rounds_f&lt;br /&gt;
&lt;br /&gt;
    -- minround -&amp;gt; base (clamped)&lt;br /&gt;
    local minr = tonumber(getPArg(&amp;quot;minround&amp;quot;)) or 1&lt;br /&gt;
    if minr &amp;lt; 1 then minr = 1 end&lt;br /&gt;
    if minr &amp;gt; config.c then minr = config.c end&lt;br /&gt;
    config.minc   = minr&lt;br /&gt;
    config.base   = minr - 1&lt;br /&gt;
    config.c_total = config.c  -- persist original visible round count&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 4) LAYOUT/STYLE FLAGS&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    config.autocol    = YES(getFArg(&amp;quot;autocol&amp;quot;))&lt;br /&gt;
    config.colspacing = tonumber(getFArg(&amp;quot;col-spacing&amp;quot;)) or 6&lt;br /&gt;
    config.height     = bargs(&amp;quot;height&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- nowrap can be supplied in parent or direct call&lt;br /&gt;
    local nowrapArg = getPArg(&amp;quot;nowrap&amp;quot;) or getFArg(&amp;quot;nowrap&amp;quot;)&lt;br /&gt;
    config.nowrap = not NO(nowrapArg)&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 5) BOLDWINNER MODE/POLICY&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    local bw = (bargs(&amp;quot;boldwinner&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    config.boldwinner           = bw&lt;br /&gt;
    config.boldwinner_mode      = &amp;quot;off&amp;quot;   -- &#039;high&#039; | &#039;low&#039; | &#039;off&#039;&lt;br /&gt;
    config.boldwinner_aggonly   = false   -- only bold aggregate cell/row&lt;br /&gt;
&lt;br /&gt;
    if bw == &amp;quot;low&amp;quot; then&lt;br /&gt;
        config.boldwinner_mode = &amp;quot;low&amp;quot;&lt;br /&gt;
    elseif bw == &amp;quot;high&amp;quot; or YES(bw) then&lt;br /&gt;
        config.boldwinner_mode = &amp;quot;high&amp;quot;&lt;br /&gt;
    elseif bw == &amp;quot;aggregate&amp;quot; or bw == &amp;quot;agg&amp;quot; or bw == &amp;quot;aggregate-high&amp;quot; or bw == &amp;quot;agg-high&amp;quot; then&lt;br /&gt;
        config.boldwinner_mode    = &amp;quot;high&amp;quot;&lt;br /&gt;
        config.boldwinner_aggonly = true&lt;br /&gt;
    elseif bw == &amp;quot;aggregate-low&amp;quot; or bw == &amp;quot;agg-low&amp;quot; then&lt;br /&gt;
        config.boldwinner_mode    = &amp;quot;low&amp;quot;&lt;br /&gt;
        config.boldwinner_aggonly = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if YES(bargs(&amp;quot;boldwinner-aggregate-only&amp;quot;)) then&lt;br /&gt;
        config.boldwinner_aggonly = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 6) SEEDS &amp;amp; AGGREGATE SETTINGS&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- forceseeds: explicit truthy; seeds: true unless explicitly &amp;quot;no&amp;quot;&lt;br /&gt;
    local seedsArg       = bargs(&amp;quot;seeds&amp;quot;)&lt;br /&gt;
    config.forceseeds    = YES(seedsArg)&lt;br /&gt;
    config.seeds         = not NO(seedsArg)&lt;br /&gt;
&lt;br /&gt;
    -- aggregate mode&lt;br /&gt;
    do&lt;br /&gt;
        local aval = (bargs(&amp;quot;aggregate&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if aval == &amp;quot;sets&amp;quot; or aval == &amp;quot;legs&amp;quot; then&lt;br /&gt;
            config.aggregate_mode = &amp;quot;sets&amp;quot;&lt;br /&gt;
        elseif aval == &amp;quot;score&amp;quot; then&lt;br /&gt;
            config.aggregate_mode = &amp;quot;score&amp;quot;&lt;br /&gt;
        elseif YES(aval) then&lt;br /&gt;
            config.aggregate_mode = &amp;quot;manual&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            config.aggregate_mode = &amp;quot;off&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        config.aggregate = (config.aggregate_mode ~= &amp;quot;off&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- show-bye-paths (default true; only explicit &amp;quot;no&amp;quot; disables)&lt;br /&gt;
    do&lt;br /&gt;
        local v = (bargs(&amp;quot;show-bye-paths&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        config.show_bye_paths = (v == &amp;quot;&amp;quot;) and true or (not NO(v))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- autolegs (explicit truthy)&lt;br /&gt;
    config.autolegs = YES(bargs(&amp;quot;autolegs&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 7) PARAMSTYLE INFERENCE&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    local styleArg = (bargs(&amp;quot;paramstyle&amp;quot;) or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    local function hasNumberedArgs()&lt;br /&gt;
        -- Scan a reasonable window of positional args from both parent/frame via bargs&lt;br /&gt;
        for n = 1, 48 do&lt;br /&gt;
            local v = bargs(tostring(n))&lt;br /&gt;
            if v ~= nil and v ~= &amp;quot;&amp;quot; then return true end&lt;br /&gt;
        end&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if styleArg == &amp;quot;numbered&amp;quot; then&lt;br /&gt;
        config.paramstyle = &amp;quot;numbered&amp;quot;&lt;br /&gt;
    elseif styleArg == &amp;quot;indexed&amp;quot; then&lt;br /&gt;
        config.paramstyle = &amp;quot;indexed&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        config.paramstyle = hasNumberedArgs() and &amp;quot;numbered&amp;quot; or &amp;quot;indexed&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    -- 8) THEME CONSTANTS (DEFAULTS)&lt;br /&gt;
    -- ====================================&lt;br /&gt;
    config.COLORS = config.COLORS or {&lt;br /&gt;
        cell_bg_light   = &amp;quot;var(--background-color-neutral-subtle,#f8f9fa)&amp;quot;,&lt;br /&gt;
        cell_bg_dark    = &amp;quot;var(--background-color-neutral,#eaecf0)&amp;quot;,&lt;br /&gt;
        text_color      = &amp;quot;var(--color-base,#202122)&amp;quot;,&lt;br /&gt;
        path_line_color = &amp;quot;gray&amp;quot;,&lt;br /&gt;
        cell_border     = &amp;quot;var(--border-color-base,#a2a9b1)&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return state, config, Helpers&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Config&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Template_for_discussion/styles.css&amp;diff=76400</id>
		<title>Template:Template for discussion/styles.css</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Template_for_discussion/styles.css&amp;diff=76400"/>
		<updated>2026-07-24T10:50:37Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp-template|small=yes}} */&lt;br /&gt;
/* See [[Template:Tfd/dated]] and [[Template:Tfm/dated]] */&lt;br /&gt;
.tfd-dated {&lt;br /&gt;
	font-size: 85%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tfd-default {&lt;br /&gt;
	border-bottom: 1px solid var(--border-color-base, #a2a9b1);&lt;br /&gt;
	/* clear: both; probably over kill e.g. https://en.wikipedia.org/w/index.php?title=Disclosure_Day&amp;amp;oldid=1361448791#Critical_response */&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tfd-tiny {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tfd-inline {&lt;br /&gt;
	border: 1px solid var(--border-color-base, #a2a9b1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tfd-sidebar {&lt;br /&gt;
	border-bottom: 1px solid var(--border-color-base, #a2a9b1);&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	position: relative;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (min-width: 640px) {&lt;br /&gt;
	.tfd-sidebar {&lt;br /&gt;
		clear: right;&lt;br /&gt;
		float: right;&lt;br /&gt;
		width: 22em;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide all but the first TFD notice in each paragraph */&lt;br /&gt;
:not(.mw-parser-output):not(.documentation) &amp;gt; .tfd-dedup ~ .tfd-dedup,&lt;br /&gt;
:not(.mw-parser-output):not(.documentation) &amp;gt; .tfd-dedup ~ * .tfd-dedup {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Bracket&amp;diff=76398</id>
		<title>Module:Bracket</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Bracket&amp;diff=76398"/>
		<updated>2026-07-24T10:50:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&#039;Module:yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
local notblank = function(v) return (v or &#039;&#039;) ~= &#039;&#039; end&lt;br /&gt;
local rmzero = function(k) return mw.ustring.gsub(k, &amp;quot;0(%d)$&amp;quot;, &amp;quot;%1&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
p[&#039;_Bracket&#039;] = function (frame, template, subs, args)&lt;br /&gt;
	-- figure out parameters from template name&lt;br /&gt;
	local consols = string.find(template, &amp;quot;-Consols&amp;quot;)&lt;br /&gt;
	local pagePlayoff = string.find(template, &amp;quot;-PagePlayoff&amp;quot;)&lt;br /&gt;
	local stepladder = string.find(template, &amp;quot;-Stepladder&amp;quot;)&lt;br /&gt;
	if (consols or pagePlayoff or stepladder) then args.build = true end&lt;br /&gt;
	&lt;br /&gt;
	args.rounds = args.rounds or mw.ustring.match(template, &amp;quot;^(%d*)Round&amp;quot;)&lt;br /&gt;
	if not args.rounds then&lt;br /&gt;
		local teams = tonumber(mw.ustring.match(template, &amp;quot;^(%d*)Team&amp;quot;))&lt;br /&gt;
		if teams and teams &amp;gt; 1 then -- log2(teams) is the number of rounds&lt;br /&gt;
			args.rounds = math.ceil( math.log(teams)/math.log(2) )&lt;br /&gt;
			if consols then&lt;br /&gt;
				args.rounds = (args.rounds * 2) - 1&lt;br /&gt;
			elseif (pagePlayoff or stepladder) then&lt;br /&gt;
				args.rounds = args.rounds + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local tennis = mw.ustring.match(template, &amp;quot;-Tennis(%d*)&amp;quot;)&lt;br /&gt;
	local squash = mw.ustring.match(template, &amp;quot;-Squash(%d*)&amp;quot;) &lt;br /&gt;
	if tennis or squash then&lt;br /&gt;
		args.sets = args.sets or tennis or squash&lt;br /&gt;
		args.seeds = args.seeds or &#039;yes&#039;&lt;br /&gt;
		args.nowrap = args.nowrap or &#039;yes&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if string.find(template, &amp;quot;-Compact&amp;quot;) then&lt;br /&gt;
		args.compact = args.compact or &#039;yes&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- remove leading zeros from defaults&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if k ~= rmzero(k) then&lt;br /&gt;
			args[rmzero(k)] = v&lt;br /&gt;
			args[k] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- overwrite defaults with frame args and alternative args&lt;br /&gt;
	for k, v in pairs(frame.args) do&lt;br /&gt;
		local leadingzero = mw.ustring.gsub(k, &amp;quot;([^0])(%d)$&amp;quot;, &amp;quot;%10%2&amp;quot;)&lt;br /&gt;
		-- remove leading 0&lt;br /&gt;
		k = rmzero(k)&lt;br /&gt;
		-- do substitutes&lt;br /&gt;
		if notblank(subs[k] or subs[leadingzero]) then&lt;br /&gt;
			-- strip leading 0s from substitutes&lt;br /&gt;
			k = rmzero(subs[k] or subs[leadingzero])&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- process parameters for &#039;-Info&#039; templates&lt;br /&gt;
	local info = string.find(template, &amp;quot;-Info&amp;quot;)&lt;br /&gt;
	if info then&lt;br /&gt;
		for i = 1,5 do&lt;br /&gt;
			local rd = &#039;RD&#039; .. i&lt;br /&gt;
			if notblank(args[rd .. &#039;-date&#039;]) then&lt;br /&gt;
				args[rd] = (args[rd] or &#039;&#039;) .. &#039;&amp;lt;br /&amp;gt;&#039; .. args[rd .. &#039;-date&#039;]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		args.build = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- return template&lt;br /&gt;
	local newFrame = frame:newChild{title = (&amp;quot;Template:&amp;quot; .. template), args = args}&lt;br /&gt;
	if args.build then&lt;br /&gt;
		return require(&#039;Module:Build bracket&#039;).main(newFrame) ..&lt;br /&gt;
			require(&#039;Module:Team bracket tracking&#039;).tracking(newFrame)&lt;br /&gt;
	end&lt;br /&gt;
	return require(&#039;Module:Team bracket&#039;).main(newFrame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;2TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;2TeamBracket&#039;, {}, {autoseeds = &amp;quot;y&amp;quot;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;2TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;2TeamBracket-Info&#039;, {&lt;br /&gt;
		[&#039;RD1-name&#039;] = &#039;RD1&#039;,&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;RD1b&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1,6&#039;,&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,8&#039;,&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;Final&#039;,&lt;br /&gt;
		[&#039;RD1b&#039;] = &#039;Third place&#039;,&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &#039;y&#039;&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;3TeamBracket-PagePlayoff&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;3TeamBracket-PagePlayoff&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;3-3,3-5:red&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;(3,5)-3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;[[Page playoff]]&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Semifinal&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;&lt;br /&gt;
	}, {&lt;br /&gt;
		autoseeds = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &amp;quot;&amp;quot;&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Consols&#039;, {&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &amp;quot;RD1-text1&amp;quot;,&lt;br /&gt;
		[&#039;RD2T1-loc&#039;] = &amp;quot;RD2-text1&amp;quot;,&lt;br /&gt;
		[&#039;RD2T2-loc&#039;] = &amp;quot;RD2-text2&amp;quot;,&lt;br /&gt;
		[&#039;RD3T1-loc&#039;] = &amp;quot;RD3-text1&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		autocol = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;4.5&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;3,6&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;4.5&amp;quot;,&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;4.5-3:red, 4.5-6:red&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;(3,6)-4.5&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Third place&amp;quot;,&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;consolation&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD2-team1&#039;] = &amp;quot;&amp;amp;nbsp&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-PagePlayoff&#039;] = function (frame)&lt;br /&gt;
	local RD1b = notblank(frame.args.RD1b)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-PagePlayoff&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD3b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1,&#039; .. (RD1b and &#039;6&#039; or &#039;&#039;),&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &#039;1,6&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,&#039; .. (RD1b and &#039;8&#039; or &#039;7&#039;),&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3,8&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = string.format(&#039;3-3, 3-5:red,%s-5&#039;, (RD1b and 8 or 7)),&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;(3,5)-3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;Semifinals&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Preliminary final&#039;,&lt;br /&gt;
		[&#039;RD3b&#039;] = &#039;Third place&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Stepladder&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Stepladder&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;5-4&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;4-3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Second round&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;3&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &#039;2&#039;,&lt;br /&gt;
		[&#039;RD3-seed1&#039;] = &#039;1&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Tennis3&#039;, {}, {&lt;br /&gt;
		seeds = &#039;&#039;,&lt;br /&gt;
		RD2 = &amp;quot;Final&amp;quot;,&lt;br /&gt;
		[&#039;team-width&#039;] = 125&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Tennis5&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Tennis5&#039;, {}, {&lt;br /&gt;
		seeds = &#039;&#039;,&lt;br /&gt;
		RD1 = &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		[&#039;team-width&#039;] = 125,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &#039;&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Tennis35&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Tennis35&#039;, {}, {&lt;br /&gt;
		sets = &amp;quot;3/5&amp;quot;,&lt;br /&gt;
		RD1 = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;Final&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &#039;&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;4TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	local qual = yesno(frame.args.qualifiers or &#039;&#039;)&lt;br /&gt;
	local losernext = yesno(frame.args.losernext or &#039;&#039;)&lt;br /&gt;
	local page = yesno(frame.args.page or &#039;&#039;)&lt;br /&gt;
	local C1C2PN = &#039;3-4.5&#039; .. ((losernext or page) and &#039;:red&#039; or &#039;&#039;)&lt;br /&gt;
	C1C2PN = C1C2PN .. &#039;,6-4.5&#039; .. (losernext and &#039;:red&#039; or &#039;&#039;)&lt;br /&gt;
	&lt;br /&gt;
	return p._Bracket(frame, &#039;4TeamBracket-Info&#039;, {&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD1T2-loc&#039;] = &#039;RD1-text2&#039;,&lt;br /&gt;
		[&#039;RD2T1-loc&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD1-name&#039;] = &#039;RD1&#039;,&lt;br /&gt;
		[&#039;RD2-name&#039;] = &#039;RD2&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col2-teams-per-match&#039;] = qual and &#039;1&#039; or nil,&lt;br /&gt;
		[&#039;RD2-legs&#039;] = qual and &#039;0&#039; or nil,&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1,7.5&#039;,&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,6&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = qual and &#039;3.5,6.5&#039; or &#039;4.5,9.5&#039;,&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = C1C2PN,&lt;br /&gt;
		RD1 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD2 = qual and &#039;Qualified&#039; or &#039;Final&#039;,&lt;br /&gt;
		RD2b = &#039;Third place&#039;,&lt;br /&gt;
		[&#039;RD2b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;5TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;5TeamBracket&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		group2 = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		byes = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &amp;quot;1/2&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &amp;quot;4&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team1&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &amp;quot;5&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team2&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed3&#039;] = &amp;quot;2&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed4&#039;] = &amp;quot;3&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;5TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;5TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1,9&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1,9&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;6,11&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;9&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;6&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;3,9&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;6,11&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;6-(3,9)&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;3-3, 9-(6,9)&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;3-3, 9-9, 6-&amp;quot; .. (&lt;br /&gt;
			(tonumber(frame.args.style) == 2) and &amp;quot;9&amp;quot; or &amp;quot;3&amp;quot;&lt;br /&gt;
		),&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(3,9)-6&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Third place&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Consolation semifinals&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;fifth&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;consolation&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;QF&amp;quot;,&lt;br /&gt;
		[&#039;RD4-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD5-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;5TeamBracket-Stepladder&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;5TeamBracket-Stepladder&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;6&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;6-5&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;5-4&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;4-3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Second round&#039;,&lt;br /&gt;
		[&#039;RD3&#039;] = &#039;Semifinal&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &#039;3&#039;,&lt;br /&gt;
		[&#039;RD3-seed1&#039;] = &#039;2&#039;,&lt;br /&gt;
		[&#039;RD4-seed1&#039;] = &#039;1&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;6TeamBracket&#039;] = function (frame)&lt;br /&gt;
	local stepdown = yesno(frame.args.stepdown)&lt;br /&gt;
	return p._Bracket(frame, &#039;6TeamBracket&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		group2 = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
		group3 = &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		compact = &amp;quot;y&amp;quot;,&lt;br /&gt;
		seeds = &amp;quot;y&amp;quot;,&lt;br /&gt;
		byes = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-omit&#039;] = stepdown and &amp;quot;3/4/7/8&amp;quot; or &amp;quot;1/2/5/6&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group2&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD2-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 4,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 5,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 3,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 6,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = stepdown and &#039;&#039; or 1,&lt;br /&gt;
		[&#039;RD2-seed2&#039;] = stepdown and 1 or &#039;&#039;,&lt;br /&gt;
		[&#039;RD2-seed3&#039;] = stepdown and &#039;&#039; or 2,&lt;br /&gt;
		[&#039;RD2-seed4&#039;] = stepdown and 2 or &#039;&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;6TeamBracket-PagePlayoff&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;6TeamBracket-PagePlayoff&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,7&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3,7&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;3-5,7-5:red,7-7&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;7-7, 5-3&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(3,7)-5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;Seeding/Play-in qualifier&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Play-in game&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;6&#039;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &#039;3&#039;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD3-seed1&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;RD3-seed3&#039;] = &#039;2&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;7TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;7TeamBracket&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		group2 = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
		group3 = &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &amp;quot;1/2&amp;quot;,&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group2&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD2-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 4,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 5,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 2,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 7,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = 3,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = 6,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = 1,&lt;br /&gt;
		[&#039;RD1-team1&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team2&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team3&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team4&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team5&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team6&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;7TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;7TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1,9&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1,9&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;6,11&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;8.5&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;4,7,10&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;3,8.5&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;6,11&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;6-(4,8.5)&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;4-4,8.5-(7,10)&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;4-3, (7,10)-8.5&amp;quot;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(3,8.5)-6&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Fifth place&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Consolation semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD1b&#039;] = &amp;quot;Seventh place&amp;quot;,&lt;br /&gt;
		[&#039;RD5b&#039;] = &amp;quot;Third place&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;fifth&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;consolation&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;QF&amp;quot;,&lt;br /&gt;
		[&#039;RD4-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD5-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-altname&#039;] = &amp;quot;seventh&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-altname&#039;] = &amp;quot;third&amp;quot;,&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;7TeamBracket-StepladderToSF&#039;] = function (frame)&lt;br /&gt;
	local shift1, shift2, shift3, shift4 = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
	local matches2 = &amp;quot;4,8&amp;quot;&lt;br /&gt;
	local paths12, paths23 = &amp;quot;5-4&amp;quot;, &amp;quot;4-3, 8-7&amp;quot;&lt;br /&gt;
	local RD3b = (&lt;br /&gt;
		notblank(frame.args.RD3b) or&lt;br /&gt;
		notblank(frame.args[&#039;RD3b-team1&#039;]) or&lt;br /&gt;
		notblank(frame.args[&#039;RD3b-team5&#039;])&lt;br /&gt;
	)&lt;br /&gt;
	&lt;br /&gt;
	if tonumber(frame.args.style) == 2 then&lt;br /&gt;
		shift1, shift2, shift3, shift4 = &amp;quot;1&amp;quot;, &amp;quot;-1&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;1&amp;quot;&lt;br /&gt;
		paths12 = &amp;quot;5-8&amp;quot;&lt;br /&gt;
	elseif tonumber(frame.args.style) == 3 then&lt;br /&gt;
		shift1, shift2, shift3, shift4 = &amp;quot;-2&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;2&amp;quot;&lt;br /&gt;
	elseif tonumber(frame.args.style) == 4 then&lt;br /&gt;
		shift1, shift2, shift3, shift4 = &amp;quot;5&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;1&amp;quot;&lt;br /&gt;
		matches2 = &amp;quot;2,8&amp;quot;&lt;br /&gt;
		paths12, paths23 = &amp;quot;5-8&amp;quot;, &amp;quot;2-3, 8-7&amp;quot;&lt;br /&gt;
	elseif tonumber(frame.args.style) == 5 then&lt;br /&gt;
		shift1, shift2, shift3, shift4 = &amp;quot;-1&amp;quot;, &amp;quot;-1&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;1&amp;quot;&lt;br /&gt;
		matches2 = &amp;quot;4,10&amp;quot;&lt;br /&gt;
		paths23 = &amp;quot;4-3, 10-7&amp;quot;&lt;br /&gt;
	elseif tonumber(frame.args.style) == 6 then&lt;br /&gt;
		shift1, shift2, shift3, shift4 = &amp;quot;-2&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;2&amp;quot;&lt;br /&gt;
		matches2 = &amp;quot;4,10&amp;quot;&lt;br /&gt;
		paths23 = &amp;quot;4-3, 10-7&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return p._Bracket(frame, &#039;7TeamBracket-StepladderToSF&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-shift&#039;] = shift1,&lt;br /&gt;
		[&#039;RD2-shift&#039;] = shift2,&lt;br /&gt;
		[&#039;RD3-shift&#039;] = shift3,&lt;br /&gt;
		[&#039;RD4-shift&#039;] = shift4,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD3b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
		[&#039;RD4b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &#039;1,10&#039;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = RD3b and &#039;1,10&#039; or &#039;1,8&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = matches2,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3,7,12&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = RD3b and &#039;5,12&#039; or &#039;5,10&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = paths12,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = paths23,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(3,7)-5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;Wild card&#039;,&lt;br /&gt;
		[&#039;RD3b&#039;] = &#039;Fifth place&#039;,&lt;br /&gt;
		[&#039;RD4b&#039;] = &#039;Third place&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket&#039;, {&lt;br /&gt;
		group1 = &#039;RD1-group1&#039;,&lt;br /&gt;
		group2 = &#039;RD1-group2&#039;,&lt;br /&gt;
		group3 = &#039;RD2-group1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 1,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 8,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 4,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 5,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = 2,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = 7,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = 3,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = 6,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-2Leg&#039;] = function (frame)&lt;br /&gt;
	local scorewidth = 25&lt;br /&gt;
	-- replicate {{ifempty}}&lt;br /&gt;
	for _,v in ipairs({&#039;score-width&#039;, &#039;game-score-width&#039;, &#039;leg-width&#039;}) do&lt;br /&gt;
		if notblank(frame.args[v]) then&lt;br /&gt;
			scorewidth = frame.args[v]&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-2Leg&#039;, {&lt;br /&gt;
		group1 = &#039;RD1-group1&#039;,&lt;br /&gt;
		group2 = &#039;RD1-group2&#039;,&lt;br /&gt;
		group3 = &#039;RD2-group1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		sets = 2,&lt;br /&gt;
		aggregate = &#039;y&#039;,&lt;br /&gt;
		autoseeds = &#039;y&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;score-width&#039;] = scorewidth,&lt;br /&gt;
		seeds = notblank(frame.args.noseeds) and &#039;n&#039; or nil,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Byes&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		group2 = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
		group3 = &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
		Consol = &amp;quot;RD3b&amp;quot;&lt;br /&gt;
	}, {&lt;br /&gt;
		seeds = &#039;yes&#039;,&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;11em&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = &#039;2em&#039;,&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD1-group2&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD2-group1&#039;] = &#039;&#039;,&lt;br /&gt;
		RD3b = frame.args[&#039;RD3-team3&#039;] and &amp;quot;Third place&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;3RoundBracket-Byes&#039;] = p[&#039;8TeamBracket-Byes&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Compact-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Compact-Byes&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		nowrap = &#039;y&#039;,&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		[&#039;seed-width&#039;] = 5,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;125&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = &#039;15&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Compact-NoSeeds-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Compact-NoSeeds-Byes&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		byes = 2,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;125&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = &#039;25&#039;,&lt;br /&gt;
		RD1 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD2 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD3 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1,13&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1,13&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;9,15&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;5,13&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;3,7,11,15&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;5,13&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;9,15&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;9-(5,13)&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;5-(3,7), 13-(11,15)&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;(3,7)-5, (11,15)-13&amp;quot;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(5,13)-9&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Fifth place&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Consolation semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD1b&#039;] = &amp;quot;Seventh place&amp;quot;,&lt;br /&gt;
		[&#039;RD5b&#039;] = &amp;quot;Third place&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;fifth&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;consolation&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;QF&amp;quot;,&lt;br /&gt;
		[&#039;RD4-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD5-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-altname&#039;] = &amp;quot;seventh&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-altname&#039;] = &amp;quot;third&amp;quot;,&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-PagePlayoff&#039;] = function (frame)&lt;br /&gt;
	local cross12 = notblank(frame.args[&#039;RD1-RD2-cross&#039;])&lt;br /&gt;
	local cross23 = notblank(frame.args[&#039;RD2-RD3-cross&#039;])&lt;br /&gt;
	local path12 = cross12 and {13, 5} or {5, 13}&lt;br /&gt;
	local path23 = cross23 and {13, 5} or {5, 13}&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-PagePlayoff&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col-spacing&#039;] = (cross12 or cross23) and &#039;12&#039; or &#039;&#039;,&lt;br /&gt;
		[&#039;shift&#039;] = notblank(frame.args[&#039;RD1-text1&#039;]) and &#039;1&#039; or &#039;&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,7,11,15&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;5,13&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;7,11&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;9&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = string.format(&#039;7-%s,11-%s,3-3,3-5:#FF3333,15-15,15-13:#FF3333&#039;,path12[1], path12[2]),&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = string.format(&#039;(3,%s)-7, (%s,15)-11&#039;, path23[1], path23[2]),&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(7,11)-9&#039;,&lt;br /&gt;
		[&#039;col1-col2-cross&#039;] = cross12 and &#039;9&#039; or &#039;&#039;,&lt;br /&gt;
		[&#039;col2-col3-cross&#039;] = cross23 and &#039;9&#039; or &#039;&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;Qualifying and elimination finals&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Semi-finals&#039;,&lt;br /&gt;
		[&#039;RD3&#039;] = &#039;Preliminary finals&#039;,&lt;br /&gt;
		[&#039;RD4&#039;] = &#039;Grand final&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &#039;8&#039;,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = &#039;6&#039;,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = &#039;7&#039;,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = &#039;2&#039;,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = &#039;3&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Stepladder&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Stepladder&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD4b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
		[&#039;RD4b&#039;] = &#039;Third place&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &#039;1,8&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;5,9&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;4,8&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;3,7&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;5,10&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;5-4, 9-8&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;4-3, 8-7&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(3,7)-5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Second round&#039;,&lt;br /&gt;
		[&#039;RD3&#039;] = &#039;Semifinals&#039;,&lt;br /&gt;
		[&#039;RD4&#039;] = &#039;Final&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &#039;8&#039;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &#039;6&#039;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &#039;7&#039;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD2-seed3&#039;] = &#039;3&#039;,&lt;br /&gt;
		[&#039;RD3-seed1&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;RD3-seed3&#039;] = &#039;2&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;8TeamBracket-Double-Stepladder&#039;] = p[&#039;8TeamBracket-Stepladder&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Tennis3&#039;, {}, {&lt;br /&gt;
		RD1 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD2 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD3 = &#039;Finals&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = 140,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 1,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 8,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 4,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 5,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = 3,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = 6,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = 2,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = 7,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Tennis5&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Tennis5&#039;, {}, {&lt;br /&gt;
		RD1 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD2 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD3 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;8TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	local RD2b = notblank(frame.arg[&#039;RD2b&#039;])&lt;br /&gt;
		or notblank(frame.arg[&#039;RD2b-team1&#039;])&lt;br /&gt;
		or notblank(frame.arg[&#039;RD2-team5&#039;])&lt;br /&gt;
	&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket-Info&#039;, {&lt;br /&gt;
		[&#039;RD1-name&#039;] = &#039;RD1&#039;,&lt;br /&gt;
		[&#039;RD2-name&#039;] = &#039;RD2&#039;,&lt;br /&gt;
		[&#039;RD3-name&#039;] = &#039;RD3&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-text1&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD1-info1&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD1-text2&#039;] = &#039;RD1-text2&#039;,&lt;br /&gt;
		[&#039;RD1-info2&#039;] = &#039;RD1-text2&#039;,&lt;br /&gt;
		[&#039;RD1T2-loc&#039;] = &#039;RD1-text2&#039;,&lt;br /&gt;
		[&#039;RD1-text3&#039;] = &#039;RD1-text3&#039;,&lt;br /&gt;
		[&#039;RD1-info3&#039;] = &#039;RD1-text3&#039;,&lt;br /&gt;
		[&#039;RD1T3-loc&#039;] = &#039;RD1-text3&#039;,&lt;br /&gt;
		[&#039;RD1-text4&#039;] = &#039;RD1-text4&#039;,&lt;br /&gt;
		[&#039;RD1-info4&#039;] = &#039;RD1-text4&#039;,&lt;br /&gt;
		[&#039;RD1T4-loc&#039;] = &#039;RD1-text4&#039;,&lt;br /&gt;
		[&#039;RD2-text1&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD2-info1&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD2T1-loc&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD2-text2&#039;] = &#039;RD2-text2&#039;,&lt;br /&gt;
		[&#039;RD2-info2&#039;] = &#039;RD2-text2&#039;,&lt;br /&gt;
		[&#039;RD2T2-loc&#039;] = &#039;RD2-text2&#039;,&lt;br /&gt;
		[&#039;RD3-text1&#039;] = &#039;RD3-text1&#039;,&lt;br /&gt;
		[&#039;RD3-info1&#039;] = &#039;RD3-text1&#039;,&lt;br /&gt;
		[&#039;RD3T1-loc&#039;] = &#039;RD3-text1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD2b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
		[&#039;RD3b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1&#039; .. (RD2b and &#039;,13.5&#039; or &#039;&#039;),&lt;br /&gt;
		[&#039;col3-headers&#039;] = &#039;1,&#039; .. (RD2b and &#039;13.5&#039; or &#039;10.5&#039;),&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,6,9,12&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;4.5,10.5&#039; .. (RD2b and &#039;,15.5&#039; or &#039;&#039;),&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;7.5,&#039; .. (RD2b and &#039;15.5&#039; or &#039;12.5&#039;),&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;(3,6)-4.5,(9,12)-10.5&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;(4.5,10.5)-7.5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		RD1 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD2 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD3 = &#039;Final&#039;,&lt;br /&gt;
		RD3b = &#039;Third place&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;8TeamBracket-info&#039;] = p[&#039;8TeamBracket-Info&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;9TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;9TeamBracket&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;compact&#039;] = &#039;y&#039;,&lt;br /&gt;
		[&#039;byes&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &#039;1/2&#039;,&lt;br /&gt;
		&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Finals&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
p[&#039;10TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;10TeamBracket&#039;, {&lt;br /&gt;
		[&#039;group1&#039;]		= &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
		[&#039;group2&#039;]		= &amp;quot;RD2-group2&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;compact&#039;]		= &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;seeds&#039;]		= &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD1-omit&#039;]	= &amp;quot;1/2/5/6/7/8/9/10/13/14/15/16&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;]			= &amp;quot;First round&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;]			= &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		[&#039;RD3&#039;]			= &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD4&#039;]			= &amp;quot;Finals&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;]	= &amp;quot;8&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;]	= &amp;quot;9&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;]	= &amp;quot;7&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;]	= &amp;quot;10&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;]	= &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed3&#039;]	= &amp;quot;4&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed4&#039;]	= &amp;quot;5&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed5&#039;]	= &amp;quot;2&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed7&#039;]	= &amp;quot;3&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed8&#039;]	= &amp;quot;6&amp;quot;&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;12TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;8TeamBracket&#039;, {&lt;br /&gt;
		[&#039;subgroup1&#039;] = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		[&#039;subgroup2&#039;] = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
		[&#039;subgroup3&#039;] = &amp;quot;RD1-group3&amp;quot;,&lt;br /&gt;
		[&#039;subgroup4&#039;] = &amp;quot;RD1-group4&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;group1&#039;] = &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
		[&#039;group2&#039;] = &amp;quot;RD2-group2&amp;quot;,&lt;br /&gt;
		[&#039;group3&#039;] = &amp;quot;RD3-group1&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &amp;quot;1/2/5/6/9/10/13/14&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;compact&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
				&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;First round&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Quarter-finals&amp;quot;,&lt;br /&gt;
		[&#039;RD3&#039;] = &amp;quot;Semi-finals&amp;quot;,&lt;br /&gt;
		[&#039;RD4&#039;] = &amp;quot;Final&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &amp;quot;8&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &amp;quot;9&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &amp;quot;5&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &amp;quot;12&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = &amp;quot;7&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = &amp;quot;10&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = &amp;quot;6&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = &amp;quot;11&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed3&#039;] = &amp;quot;4&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed5&#039;] = &amp;quot;2&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed7&#039;] = &amp;quot;3&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;12TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;12TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;rounds&#039;] = &amp;quot;6&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1,12.5&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1,16.5&amp;quot;,&lt;br /&gt;
		[&#039;col6-headers&#039;] = &amp;quot;1,12,16.5,23&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;8.5,14.5&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;5.5,11.5&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;4,7,10,13&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;3,6,9,12&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;4.5,10.5,18.5,21.5&amp;quot;,&lt;br /&gt;
		[&#039;col6-matches&#039;] = &amp;quot;7.5,14,20,25&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;8.5-(5.5,11.5)&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;5.5-(4,7), 11.5-(10,13)&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;4-3,7-6,10-9,13-12&amp;quot;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(3,6)-4.5, (9,12)-10.5&amp;quot;,&lt;br /&gt;
		[&#039;col5-col6-paths&#039;] = &amp;quot;(4.5,10.5)-7.5,(18.5,21.5)-20&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD5b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD6b-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD6c-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD6d-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Ninth place&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Consolation semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD3&#039;] = &amp;quot;First round&amp;quot;,&lt;br /&gt;
		[&#039;RD1b&#039;] = &amp;quot;Eleventh place&amp;quot;,&lt;br /&gt;
		[&#039;RD5b&#039;] = &amp;quot;5th–8th classification&amp;quot;,&lt;br /&gt;
		[&#039;RD6b&#039;] = &amp;quot;Third place&amp;quot;, [&#039;RD6c&#039;] = &amp;quot;Fifth place&amp;quot;, [&#039;RD6d&#039;] = &amp;quot;Seventh place&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;, [&#039;RD1c-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;, [&#039;RD1d-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;9thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;9to12SF&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;9to16QF&amp;quot;,&lt;br /&gt;
		[&#039;RD4-altname&#039;] = &amp;quot;Ro16&amp;quot;,&lt;br /&gt;
		[&#039;RD5-altname&#039;] = &amp;quot;QF&amp;quot;,&lt;br /&gt;
		[&#039;RD6-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD7-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-altname&#039;] = &amp;quot;11thplace&amp;quot;, [&#039;RD1c-altname&#039;] = &amp;quot;13thplace&amp;quot;, [&#039;RD1d-altname&#039;] = &amp;quot;15thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD2b-altname&#039;] = &amp;quot;13to16SF&amp;quot;,&lt;br /&gt;
		[&#039;RD6b-altname&#039;] = &amp;quot;5to8SF&amp;quot;,&lt;br /&gt;
		[&#039;RD7b-altname&#039;] = &amp;quot;3rdplace&amp;quot;, [&#039;RD7c-altname&#039;] = &amp;quot;5thplace&amp;quot;, [&#039;RD7d-altname&#039;] = &amp;quot;7thplace&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;14TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;14TeamBracket&#039;, {&lt;br /&gt;
		[&#039;subgroup1&#039;] = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		[&#039;subgroup2&#039;] = &amp;quot;RD1-group2&amp;quot;,&lt;br /&gt;
		[&#039;subgroup3&#039;] = &amp;quot;RD1-group3&amp;quot;,&lt;br /&gt;
		[&#039;subgroup4&#039;] = &amp;quot;RD1-group4&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;group1&#039;] = &amp;quot;RD2-group1&amp;quot;,&lt;br /&gt;
		[&#039;group2&#039;] = &amp;quot;RD2-group2&amp;quot;,&lt;br /&gt;
		[&#039;group3&#039;] = &amp;quot;RD3-group1&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &amp;quot;1/2/9/10&amp;quot;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;First round&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		[&#039;RD3&#039;] = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD4&#039;] = &amp;quot;Final&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-team1&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team2&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team3&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team4&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team5&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team6&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team7&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team8&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team9&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team10&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team11&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-team12&#039;] = &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group2&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group3&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-group4&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD2-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD2-group2&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD3-group1&#039;] = &amp;quot;&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = &amp;quot;8&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = &amp;quot;9&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = &amp;quot;4&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = &amp;quot;13&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = &amp;quot;5&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = &amp;quot;12&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = &amp;quot;7&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = &amp;quot;10&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed9&#039;] = &amp;quot;3&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed10&#039;] = &amp;quot;14&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed11&#039;] = &amp;quot;6&amp;quot;,&lt;br /&gt;
		[&#039;RD1-seed12&#039;] = &amp;quot;11&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed1&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;RD2-seed5&#039;] = &amp;quot;2&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;14TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;14TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;rounds&#039;] = &amp;quot;5&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1,18.5&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1,18.5&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;5,9,13,17&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;4,8,12,16&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;6,14,20&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;5,13,20&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;9&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;5-4,9-8,13-12,17-16&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;(4,8)-6,(12,16)-14&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;6-5,14-13&amp;quot;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(5,13)-9&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;14TeamBracket-Stepladder&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;14TeamBracket-Stepladder&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;rounds&#039;] = &#039;7&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;8,15&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;7,14&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;6,13&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;5,12&#039;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &#039;4,11&#039;,&lt;br /&gt;
		[&#039;col6-matches&#039;] = &#039;3,10&#039;,&lt;br /&gt;
		[&#039;col7-matches&#039;] = &#039;7&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;8-7,15-14&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;7-6,14-13&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;6-5,13-12&#039;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &#039;5-4,12-11&#039;,&lt;br /&gt;
		[&#039;col5-col6-paths&#039;] = &#039;4-3,11-10&#039;,&lt;br /&gt;
		[&#039;col6-col7-paths&#039;] = &#039;(3,10)-7&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed01&#039;] = &#039;12&#039;,&lt;br /&gt;
		[&#039;RD1-seed02&#039;] = &#039;13&#039;,&lt;br /&gt;
		[&#039;RD1-seed03&#039;] = &#039;11&#039;,&lt;br /&gt;
		[&#039;RD1-seed04&#039;] = &#039;14&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD2-seed01&#039;] = &#039;9&#039;,&lt;br /&gt;
		[&#039;RD2-seed03&#039;] = &#039;10&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD3-seed01&#039;] = &#039;8&#039;,&lt;br /&gt;
		[&#039;RD3-seed03&#039;] = &#039;7&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD4-seed01&#039;] = &#039;5&#039;,&lt;br /&gt;
		[&#039;RD4-seed03&#039;] = &#039;6&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD5-seed01&#039;] = &#039;4&#039;,&lt;br /&gt;
		[&#039;RD5-seed03&#039;] = &#039;3&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD6-seed01&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;RD6-seed03&#039;] = &#039;2&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket&#039;, {&lt;br /&gt;
		subgroup1 = &#039;RD1-group1&#039;,&lt;br /&gt;
		subgroup2 = &#039;RD1-group2&#039;,&lt;br /&gt;
		subgroup3 = &#039;RD1-group3&#039;,&lt;br /&gt;
		subgroup4 = &#039;RD1-group4&#039;,&lt;br /&gt;
		&lt;br /&gt;
		group1 = &#039;RD2-group1&#039;,&lt;br /&gt;
		group2 = &#039;RD2-group2&#039;,&lt;br /&gt;
		group3 = &#039;RD3-group1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 1,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 16,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 8,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 9,&lt;br /&gt;
		[&#039;RD1-seed5&#039;] = 5,&lt;br /&gt;
		[&#039;RD1-seed6&#039;] = 12,&lt;br /&gt;
		[&#039;RD1-seed7&#039;] = 4,&lt;br /&gt;
		[&#039;RD1-seed8&#039;] = 13,&lt;br /&gt;
		[&#039;RD1-seed9&#039;] = 6,&lt;br /&gt;
		[&#039;RD1-seed10&#039;] = 11,&lt;br /&gt;
		[&#039;RD1-seed11&#039;] = 3,&lt;br /&gt;
		[&#039;RD1-seed12&#039;] = 14,&lt;br /&gt;
		[&#039;RD1-seed13&#039;] = 7,&lt;br /&gt;
		[&#039;RD1-seed14&#039;] = 10,&lt;br /&gt;
		[&#039;RD1-seed15&#039;] = 2,&lt;br /&gt;
		[&#039;RD1-seed16&#039;] = 15,&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Quarter-finals&#039;,&lt;br /&gt;
		RD3 = &#039;Semi-finals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Byes&#039;, {&lt;br /&gt;
		group1 = &amp;quot;RD1-group1&amp;quot;,&lt;br /&gt;
		group2 = &amp;quot;RD2-group2&amp;quot;,&lt;br /&gt;
	}, {&lt;br /&gt;
		seeds = &#039;yes&#039;,&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Second round&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Finals&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;11em&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = &#039;2em&#039;,&lt;br /&gt;
		[&#039;RD1-group1&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD2-group2&#039;] = &#039;&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;4RoundBracket-Byes&#039;] = p[&#039;16TeamBracket-Byes&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Consols&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Consols&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1b-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD1c-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD1d-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD2b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD6b-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
		[&#039;RD7b-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD7c-hide&#039;] = &amp;quot;y&amp;quot;, [&#039;RD7d-hide&#039;] = &amp;quot;y&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-headers&#039;] = &amp;quot;1,16.5,22.5,29&amp;quot;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &amp;quot;1,22.5&amp;quot;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col5-headers&#039;] = &amp;quot;1&amp;quot;,&lt;br /&gt;
		[&#039;col6-headers&#039;] = &amp;quot;1,22.5&amp;quot;,&lt;br /&gt;
		[&#039;col7-headers&#039;] = &amp;quot;1,16.5,22.5,29&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &amp;quot;13.5,18.5,26,31&amp;quot;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &amp;quot;7.5,19.5,24.5,27.5&amp;quot;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &amp;quot;4.5,10.5,16.5,22.5&amp;quot;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &amp;quot;3,6,9,12,15,18,21,24&amp;quot;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &amp;quot;4.5,10.5,16.5,22.5&amp;quot;,&lt;br /&gt;
		[&#039;col6-matches&#039;] = &amp;quot;7.5,19.5,24.5,27.5&amp;quot;,&lt;br /&gt;
		[&#039;col7-matches&#039;] = &amp;quot;13.5,18.5,26,31&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &amp;quot;13.5-(7.5,19.5),26-(24.5,27.5)&amp;quot;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &amp;quot;7.5-(4.5,10.5), 19.5-(16.5,22.5)&amp;quot;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &amp;quot;4.5-(3,6), 10.5-(9,12), 16.5-(15,18), 22.5-(21,24)&amp;quot;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &amp;quot;(3,6)-4.5, (9,12)-10.5, (15,18)-16.5, (21,24)-22.5&amp;quot;,&lt;br /&gt;
		[&#039;col5-col6-paths&#039;] = &amp;quot;(4.5,10.5)-7.5, (16.5,22.5)-19.5&amp;quot;,&lt;br /&gt;
		[&#039;col6-col7-paths&#039;] = &amp;quot;(7.5,19.5)-13.5,(24.5,27.5)-26&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &amp;quot;Ninth place&amp;quot;,&lt;br /&gt;
		[&#039;RD2&#039;] = &amp;quot;Consolation semifinals&amp;quot;,&lt;br /&gt;
		[&#039;RD3&#039;] = &amp;quot;Consolation quarterfinals&amp;quot;,&lt;br /&gt;
		[&#039;RD4&#039;] = &amp;quot;Round of 16&amp;quot;,&lt;br /&gt;
		[&#039;RD1b&#039;] = &amp;quot;Eleventh place&amp;quot;,&lt;br /&gt;
		[&#039;RD1c&#039;] = &amp;quot;Thirteenth place&amp;quot;,&lt;br /&gt;
		[&#039;RD1d&#039;] = &amp;quot;Fifteenth place&amp;quot;,&lt;br /&gt;
		[&#039;RD2b&#039;] = &amp;quot;13th–16th classification&amp;quot;,&lt;br /&gt;
		[&#039;RD6b&#039;] = &amp;quot;5th–8th classification&amp;quot;,&lt;br /&gt;
		[&#039;RD7b&#039;] = &amp;quot;Third place&amp;quot;,&lt;br /&gt;
		[&#039;RD7c&#039;] = &amp;quot;Fifth place&amp;quot;,&lt;br /&gt;
		[&#039;RD7d&#039;] = &amp;quot;Seventh place&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD3-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1c-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD1d-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
		[&#039;RD2b-shade&#039;] = &amp;quot;#FFFFFF&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1-altname&#039;] = &amp;quot;9thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD2-altname&#039;] = &amp;quot;9to12SF&amp;quot;,&lt;br /&gt;
		[&#039;RD3-altname&#039;] = &amp;quot;9to16QF&amp;quot;,&lt;br /&gt;
		[&#039;RD4-altname&#039;] = &amp;quot;Ro16&amp;quot;,&lt;br /&gt;
		[&#039;RD5-altname&#039;] = &amp;quot;QF&amp;quot;,&lt;br /&gt;
		[&#039;RD6-altname&#039;] = &amp;quot;SF&amp;quot;,&lt;br /&gt;
		[&#039;RD7-altname&#039;] = &amp;quot;final&amp;quot;,&lt;br /&gt;
		[&#039;RD1b-altname&#039;] = &amp;quot;11thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD1c-altname&#039;] = &amp;quot;13thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD1d-altname&#039;] = &amp;quot;15thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD2b-altname&#039;] = &amp;quot;13to16SF&amp;quot;,&lt;br /&gt;
		[&#039;RD6b-altname&#039;] = &amp;quot;5to8SF&amp;quot;,&lt;br /&gt;
		[&#039;RD7b-altname&#039;] = &amp;quot;3rdplace&amp;quot;,&lt;br /&gt;
		[&#039;RD7c-altname&#039;] = &amp;quot;5thplace&amp;quot;,&lt;br /&gt;
		[&#039;RD7d-altname&#039;] = &amp;quot;7thplace&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;text-altname&#039;] = &amp;quot;details&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Tennis3&#039;, {}, {&lt;br /&gt;
		[&#039;team-width&#039;] = 140,&lt;br /&gt;
		[&#039;score-width&#039;] = 25,&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Tennis3-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Tennis3-Byes&#039;, {}, {&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		[&#039;team-width&#039;] = 125,&lt;br /&gt;
		[&#039;score-width&#039;] = 25,&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Finals&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-NoSeeds-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-NoSeeds-Byes&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		byes = 3,&lt;br /&gt;
		RD1 = &#039;Round of 16&#039;,&lt;br /&gt;
		RD2 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = 125,&lt;br /&gt;
		[&#039;score-width&#039;] = 25&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-Tennis3&#039;, {}, {&lt;br /&gt;
		RD1 = &#039;1st round&#039;,&lt;br /&gt;
		RD2 = &#039;2nd round&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-Tennis3-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-Tennis3-Byes&#039;, {}, {&lt;br /&gt;
		byes = 2,&lt;br /&gt;
		[&#039;seed-width&#039;] = 25,&lt;br /&gt;
		[&#039;team-width&#039;] = 150,&lt;br /&gt;
		RD1 = &#039;1st round&#039;,&lt;br /&gt;
		RD2 = &#039;2nd round&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;4RoundBracket-Compact-Tennis3-Byes&#039;] = p[&#039;16TeamBracket-Compact-Tennis3-Byes&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-Archery&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-Archery&#039;, {}, {&lt;br /&gt;
		nowrap = &#039;yes&#039;,&lt;br /&gt;
		sets = 6,&lt;br /&gt;
		seeds = &#039;yes&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = 150,&lt;br /&gt;
		[&#039;score-width&#039;] = 12,&lt;br /&gt;
		RD1 = &#039;1st round&#039;,&lt;br /&gt;
		RD2 = &#039;2nd round&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Finals&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Tennis5&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Tennis5&#039;, {}, {&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
		[&#039;seed-width&#039;] = 25,&lt;br /&gt;
		[&#039;team-width&#039;] = 150,&lt;br /&gt;
		[&#039;score-width&#039;] = 12,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-Tennis5&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-Tennis5&#039;, {}, {&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Second round&#039;,&lt;br /&gt;
		RD3 = &#039;Third round&#039;,&lt;br /&gt;
		RD4 = &#039;Fourth round&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Compact-Tennis5-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Compact-Tennis5-Byes&#039;, {}, {&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		RD1 = &#039;First round&#039;,&lt;br /&gt;
		RD2 = &#039;Second round&#039;,&lt;br /&gt;
		RD3 = &#039;Semifinals&#039;,&lt;br /&gt;
		RD4 = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;4RoundBracket-Compact-Tennis5-Byes&#039;] = p[&#039;16TeamBracket-Compact-Tennis5-Byes&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;16TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;16TeamBracket-Info&#039;, {&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD1T2-loc&#039;] = &#039;RD1-text2&#039;,&lt;br /&gt;
		[&#039;RD1T3-loc&#039;] = &#039;RD1-text3&#039;,&lt;br /&gt;
		[&#039;RD1T4-loc&#039;] = &#039;RD1-text4&#039;,&lt;br /&gt;
		[&#039;RD1T5-loc&#039;] = &#039;RD1-text5&#039;,&lt;br /&gt;
		[&#039;RD1T6-loc&#039;] = &#039;RD1-text6&#039;,&lt;br /&gt;
		[&#039;RD1T7-loc&#039;] = &#039;RD1-text7&#039;,&lt;br /&gt;
		[&#039;RD1T8-loc&#039;] = &#039;RD1-text8&#039;,&lt;br /&gt;
		[&#039;RD2T1-loc&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD2T2-loc&#039;] = &#039;RD2-text2&#039;,&lt;br /&gt;
		[&#039;RD2T3-loc&#039;] = &#039;RD2-text3&#039;,&lt;br /&gt;
		[&#039;RD2T4-loc&#039;] = &#039;RD2-text4&#039;,&lt;br /&gt;
		[&#039;RD3T1-loc&#039;] = &#039;RD3-text1&#039;,&lt;br /&gt;
		[&#039;RD3T2-loc&#039;] = &#039;RD3-text2&#039;,&lt;br /&gt;
		[&#039;RD4T1-loc&#039;] = &#039;RD4-text1&#039;,&lt;br /&gt;
		[&#039;RD1-name&#039;] = &#039;RD1&#039;,&lt;br /&gt;
		[&#039;RD2-name&#039;] = &#039;RD2&#039;,&lt;br /&gt;
		[&#039;RD3-name&#039;] = &#039;RD3&#039;,&lt;br /&gt;
		[&#039;RD4-name&#039;] = &#039;RD4&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col2-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col3-headers&#039;] = &#039;1&#039;,&lt;br /&gt;
		[&#039;col4-headers&#039;] = &#039;1,20.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-matches&#039;] = &#039;3,6,9,12,15,18,21,24&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;4.5,10.5,16.5,22.5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;7.5,19.5&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;13.5,22.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = &#039;(3,6)-4.5,(9,12)-10.5,(15,18)-16.5,(21,24)-22.5&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;(4.5,10.5)-7.5,(16.5,22.5)-19.5&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(7.5,19.5)-13.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Quarterfinals&#039;,&lt;br /&gt;
		[&#039;RD3&#039;] = &#039;Semifinals&#039;,&lt;br /&gt;
		[&#039;RD4&#039;] = &#039;Final&#039;,&lt;br /&gt;
		[&#039;RD4b&#039;] = &#039;Third place&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD4b-hide&#039;] = &#039;y&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;18TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;18TeamBracket&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		compact = &#039;yes&#039;,&lt;br /&gt;
		[&#039;RD1-omit&#039;] = &#039;1/2/5/6/7/8/9/10/11/12/13/14/15/16/17/18/21/22/23/24/25/26/27/28/29/30/31/32&#039;,&lt;br /&gt;
		RD1        = &#039;First round&#039;,&lt;br /&gt;
		RD2        = &#039;Second round&#039;,&lt;br /&gt;
		RD3        = &#039;Quarterfinals&#039;,&lt;br /&gt;
		RD4        = &#039;Semifinals&#039;,&lt;br /&gt;
		RD5        = &#039;Finals&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD1-seed1&#039;] = 16,&lt;br /&gt;
		[&#039;RD1-seed2&#039;] = 17,&lt;br /&gt;
		[&#039;RD1-seed3&#039;] = 15,&lt;br /&gt;
		[&#039;RD1-seed4&#039;] = 18,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;RD2-seed01&#039;] = 1,&lt;br /&gt;
		[&#039;RD2-seed02&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD2-seed03&#039;] = 8,&lt;br /&gt;
		[&#039;RD2-seed04&#039;] = 9,&lt;br /&gt;
		[&#039;RD2-seed05&#039;] = 4,&lt;br /&gt;
		[&#039;RD2-seed06&#039;] = 13,&lt;br /&gt;
		[&#039;RD2-seed07&#039;] = 5,&lt;br /&gt;
		[&#039;RD2-seed08&#039;] = 12,&lt;br /&gt;
		[&#039;RD2-seed09&#039;] = 2,&lt;br /&gt;
		[&#039;RD2-seed10&#039;] = &#039;&#039;,&lt;br /&gt;
		[&#039;RD2-seed11&#039;] = 7,&lt;br /&gt;
		[&#039;RD2-seed12&#039;] = 10,&lt;br /&gt;
		[&#039;RD2-seed13&#039;] = 3,&lt;br /&gt;
		[&#039;RD2-seed14&#039;] = 14,&lt;br /&gt;
		[&#039;RD2-seed15&#039;] = 6,&lt;br /&gt;
		[&#039;RD2-seed16&#039;] = 11,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;24TeamBracket&#039;] = function (frame)&lt;br /&gt;
	local groups = {&amp;quot;RD1-group1&amp;quot;,&amp;quot;RD1-group2&amp;quot;,&amp;quot;RD1-group3&amp;quot;,&amp;quot;RD1-group4&amp;quot;,&amp;quot;RD1-group5&amp;quot;,&amp;quot;RD1-group6&amp;quot;,&amp;quot;RD1-group7&amp;quot;,&amp;quot;RD1-group8&amp;quot;,&amp;quot;RD2-group1&amp;quot;,&amp;quot;RD2-group2&amp;quot;,&amp;quot;RD2-group3&amp;quot;,&amp;quot;RD2-group4&amp;quot;,&amp;quot;RD3-group1&amp;quot;,&amp;quot;RD3-group2&amp;quot;,&amp;quot;RD4-group1&amp;quot;}&lt;br /&gt;
	local compact = &amp;quot;yes&amp;quot;&lt;br /&gt;
	for _, v in ipairs(groups) do&lt;br /&gt;
		if notblank(frame[v]) then&lt;br /&gt;
			compact = &amp;quot;&amp;quot;&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return p._Bracket(frame, &#039;24TeamBracket&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;RD1=omit&#039;] = &#039;1/2/5/6/9/10/13/14/17/18/21/22/25/26/29/30&#039;,&lt;br /&gt;
		byes = &#039;1&#039;,&lt;br /&gt;
		compact = compact,&lt;br /&gt;
		RD1 = &#039;First Round&#039;,&lt;br /&gt;
		RD2 = &#039;Round of 16&#039;,&lt;br /&gt;
		[&#039;RD1-team1&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team2&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team3&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team4&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team5&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team6&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team7&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team8&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team9&#039;]  = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team10&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team11&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team12&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team13&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team14&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team15&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		[&#039;RD1-team16&#039;] = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;24TeamBracket-Byes2&#039;] = p[&#039;24TeamBracket&#039;]&lt;br /&gt;
p[&#039;24TeamBracket-NoSeeds&#039;] = p[&#039;24TeamBracket&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;24TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	local above = notblank(frame.args.above)&lt;br /&gt;
	return p._Bracket(frame, &#039;24TeamBracket-Info&#039;, {&lt;br /&gt;
	}, {&lt;br /&gt;
		shift = above and &#039;1&#039; or &#039;&#039;,&lt;br /&gt;
		[&#039;col1-matches&#039;] = above and &#039;2,5,8,11,14,17,20,23&#039; or &#039;4,7,10,13,16,19,22,25&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = &#039;3,6,9,12,15,18,21,24&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = &#039;4.5,10.5,16.5,22.5&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = &#039;7.5,19.5&#039;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = &#039;13.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = above and &#039;2-3,5-6,8-9,11-12,14-15,17-18,20-21,23-24&#039; or &#039;4-3,7-6,10-9,13-12,16-15,19-18,22-21,25-24&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = &#039;(3,6)-4.5,(9,12)-10.5,(15,18)-16.5,(21,24)-22.5&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = &#039;(4.5,10.5)-7.5,(16.5,22.5)-19.5&#039;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = &#039;(7.5,19.5)-13.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Second round&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
p[&#039;24TeamBracket-Byes&#039;] = p[&#039;24TeamBracket-Info&#039;]&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket&#039;, {&lt;br /&gt;
		subgroup1 = &#039;RD1-group1&#039;,&lt;br /&gt;
		subgroup2 = &#039;RD1-group2&#039;,&lt;br /&gt;
		subgroup3 = &#039;RD1-group3&#039;,&lt;br /&gt;
		subgroup4 = &#039;RD1-group4&#039;,&lt;br /&gt;
		subgroup5 = &#039;RD1-group5&#039;,&lt;br /&gt;
		subgroup6 = &#039;RD1-group6&#039;,&lt;br /&gt;
		subgroup7 = &#039;RD1-group7&#039;,&lt;br /&gt;
		subgroup8 = &#039;RD1-group8&#039;,&lt;br /&gt;
		group1 = &#039;RD2-group1&#039;,&lt;br /&gt;
		group2 = &#039;RD2-group2&#039;,&lt;br /&gt;
		group3 = &#039;RD3-group3&#039;,&lt;br /&gt;
		group4 = &#039;RD2-group4&#039;,&lt;br /&gt;
		half1 = &#039;RD3-group1&#039;,&lt;br /&gt;
		half2 = &#039;RD3-group2&#039;,&lt;br /&gt;
		group5 = &#039;RD4-group1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		autoseeds = &#039;y&#039;,&lt;br /&gt;
		RD1 = &amp;quot;1st Round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;2nd Round&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Byes&#039;, {}, {&lt;br /&gt;
		byes = 1,&lt;br /&gt;
		seeds = &#039;y&#039;,&lt;br /&gt;
		RD1 = &amp;quot;First Round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;Second Round&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;Quarter Finals&amp;quot;,&lt;br /&gt;
		RD4 = &amp;quot;Semi Finals&amp;quot;,&lt;br /&gt;
		RD5 = &amp;quot;Final&amp;quot;,&lt;br /&gt;
		[&#039;seed-width&#039;] = &#039;2em&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;11em&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = &#039;2em&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Compact-NoSeeds-Byes&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Compact-NoSeeds-Byes&#039;, {}, {&lt;br /&gt;
		byes = 4,&lt;br /&gt;
		RD1 = &amp;quot;Round of 32&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;Round of 16&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		RD4 = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		RD5 = &amp;quot;Final&amp;quot;,&lt;br /&gt;
		[&#039;team-width&#039;] = 125,&lt;br /&gt;
		[&#039;score-width&#039;] = 25,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Compact-Squash5&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Compact-Squash5&#039;, {}, {&lt;br /&gt;
		[&#039;compact-final&#039;] = &#039;yes&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = 190,&lt;br /&gt;
		[&#039;score-width&#039;] = 12,&lt;br /&gt;
		[&#039;seed-width&#039;] = 10,&lt;br /&gt;
		RD1 = &amp;quot;1st round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;2nd round&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;3rd round&amp;quot;,&lt;br /&gt;
		RD4 = &amp;quot;4th round&amp;quot;,&lt;br /&gt;
		RD5 = &amp;quot;5th round&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Compact-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Compact-Tennis3&#039;, {}, {&lt;br /&gt;
		seeds = &#039;&#039;,&lt;br /&gt;
		[&#039;compact-final&#039;] = &#039;yes&#039;,&lt;br /&gt;
		[&#039;team-width&#039;] = &#039;auto&#039;,&lt;br /&gt;
		[&#039;score-width&#039;] = 12,&lt;br /&gt;
		RD1 = &amp;quot;1st round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;2nd round&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		RD4 = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		RD5 = &amp;quot;Finals&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Tennis3&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Tennis3&#039;, {}, {&lt;br /&gt;
		compact = &#039;yes&#039;,&lt;br /&gt;
		RD1 = &amp;quot;First Round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;Second Round&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;Quarterfinals&amp;quot;,&lt;br /&gt;
		RD4 = &amp;quot;Semifinals&amp;quot;,&lt;br /&gt;
		RD5 = &amp;quot;Final&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;32TeamBracket-Info&#039;] = function (frame)&lt;br /&gt;
	local compact = notblank(frame.args.compact)&lt;br /&gt;
	&lt;br /&gt;
	return p._Bracket(frame, &#039;32TeamBracket-Info&#039;, {&lt;br /&gt;
		[&#039;RD1-name&#039;] = &#039;RD1&#039;,&lt;br /&gt;
		[&#039;RD2-name&#039;] = &#039;RD2&#039;,&lt;br /&gt;
		[&#039;RD3-name&#039;] = &#039;RD3&#039;,&lt;br /&gt;
		[&#039;RD4-name&#039;] = &#039;RD4&#039;,&lt;br /&gt;
		[&#039;RD5-name&#039;] = &#039;RD5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1T1-loc&#039;] = &#039;RD1-text1&#039;,&lt;br /&gt;
		[&#039;RD2T1-loc&#039;] = &#039;RD2-text1&#039;,&lt;br /&gt;
		[&#039;RD2T2-loc&#039;] = &#039;RD2-text2&#039;,&lt;br /&gt;
		[&#039;RD2T3-loc&#039;] = &#039;RD2-text3&#039;,&lt;br /&gt;
		[&#039;RD2T4-loc&#039;] = &#039;RD2-text4&#039;,&lt;br /&gt;
		[&#039;RD2T5-loc&#039;] = &#039;RD2-text5&#039;,&lt;br /&gt;
		[&#039;RD2T6-loc&#039;] = &#039;RD2-text6&#039;,&lt;br /&gt;
		[&#039;RD2T7-loc&#039;] = &#039;RD2-text7&#039;,&lt;br /&gt;
		[&#039;RD2T8-loc&#039;] = &#039;RD2-text8&#039;,&lt;br /&gt;
		[&#039;RD3T1-loc&#039;] = &#039;RD3-text1&#039;,&lt;br /&gt;
		[&#039;RD3T2-loc&#039;] = &#039;RD3-text2&#039;,&lt;br /&gt;
		[&#039;RD3T3-loc&#039;] = &#039;RD3-text3&#039;,&lt;br /&gt;
		[&#039;RD3T4-loc&#039;] = &#039;RD3-text4&#039;,&lt;br /&gt;
		[&#039;RD4T1-loc&#039;] = &#039;RD4-text1&#039;,&lt;br /&gt;
		[&#039;RD4T2-loc&#039;] = &#039;RD4-text2&#039;,&lt;br /&gt;
		[&#039;RD5T1-loc&#039;] = &#039;RD5-text1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		[&#039;col1-matches&#039;] = compact and &#039;3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33&#039; or &#039;3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48&#039;,&lt;br /&gt;
		[&#039;col2-matches&#039;] = compact and &#039;4,8,12,16,20,24,28,32&#039; or &#039;4.5,10.5,16.5,22.5,28.5,34.5,40.5,46.5&#039;,&lt;br /&gt;
		[&#039;col3-matches&#039;] = compact and &#039;6,14,22,30&#039; or &#039;7.5,19.5,31.5,43.5&#039;,&lt;br /&gt;
		[&#039;col4-matches&#039;] = compact and &#039;10,26&#039; or &#039;13.5,37.5&#039;,&lt;br /&gt;
		[&#039;col5-matches&#039;] = compact and &#039;18&#039; or &#039;25.5&#039;,&lt;br /&gt;
		&lt;br /&gt;
		[&#039;col1-col2-paths&#039;] = compact and &#039;(3,5)-4,(7,9)-8,(11,13)-12,(15,17)-16,(19,21)-20,(23,25)-24,(27,29)-28,(31,33)-32&#039; or&lt;br /&gt;
			&#039;(3,6)-4.5,(9,12)-10.5,(15,18)-16.5,(21,24)-22.5,(27,30)-28.5,(33,36)-34.5,(39,42)-40.5,(45,48)-46.5&#039;,&lt;br /&gt;
		[&#039;col2-col3-paths&#039;] = compact and &#039;(4,8)-6,(12,16)-14,(20,24)-22,(28,32)-30&#039; or&lt;br /&gt;
			&#039;(4.5,10.5)-7.5,(16.5,22.5)-19.5,(28.5,34.5)-31.5,(40.5,46.5)-43.5&#039;,&lt;br /&gt;
		[&#039;col3-col4-paths&#039;] = compact and &#039;(6,14)-10,(22,30)-26&#039; or &#039;(7.5,19.5)-13.5,(31.5,43.5)-37.5&#039;,&lt;br /&gt;
		[&#039;col4-col5-paths&#039;] = compact and &#039;(10,26)-18&#039; or &#039;(13.5,37.5)-25.5&#039;,&lt;br /&gt;
&lt;br /&gt;
		[&#039;RD1&#039;] = &#039;First round&#039;,&lt;br /&gt;
		[&#039;RD2&#039;] = &#039;Second round&#039;,&lt;br /&gt;
		[&#039;RD3&#039;] = &#039;Quarterfinals&#039;,&lt;br /&gt;
		[&#039;RD4&#039;] = &#039;Semifinals&#039;,&lt;br /&gt;
		[&#039;RD5&#039;] = &#039;Final&#039;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;64TeamBracket&#039;] = function (frame)&lt;br /&gt;
	return p._Bracket(frame, &#039;64TeamBracket&#039;, {&lt;br /&gt;
		subgroup1 = &#039;RD1-group1&#039;,&lt;br /&gt;
		subgroup2 = &#039;RD1-group2&#039;,&lt;br /&gt;
		subgroup3 = &#039;RD1-group3&#039;,&lt;br /&gt;
		subgroup4 = &#039;RD1-group4&#039;,&lt;br /&gt;
		subgroup5 = &#039;RD1-group5&#039;,&lt;br /&gt;
		subgroup6 = &#039;RD1-group6&#039;,&lt;br /&gt;
		subgroup7 = &#039;RD1-group7&#039;,&lt;br /&gt;
		subgroup8 = &#039;RD1-group8&#039;,&lt;br /&gt;
		subgroup9 = &#039;RD1-group9&#039;,&lt;br /&gt;
		subgroup10 = &#039;RD1-group10&#039;,&lt;br /&gt;
		subgroup11 = &#039;RD1-group11&#039;,&lt;br /&gt;
		subgroup12 = &#039;RD1-group12&#039;,&lt;br /&gt;
		subgroup13 = &#039;RD1-group13&#039;,&lt;br /&gt;
		subgroup14 = &#039;RD1-group14&#039;,&lt;br /&gt;
		subgroup15 = &#039;RD1-group15&#039;,&lt;br /&gt;
		subgroup16 = &#039;RD1-group16&#039;,&lt;br /&gt;
		group1 = &#039;RD2-group1&#039;,&lt;br /&gt;
		group2 = &#039;RD2-group2&#039;,&lt;br /&gt;
		group3 = &#039;RD3-group3&#039;,&lt;br /&gt;
		group4 = &#039;RD2-group4&#039;,&lt;br /&gt;
		group5 = &#039;RD2-group5&#039;,&lt;br /&gt;
		group6 = &#039;RD3-group6&#039;,&lt;br /&gt;
		group7 = &#039;RD2-group7&#039;,&lt;br /&gt;
		group8 = &#039;RD2-group8&#039;,&lt;br /&gt;
		quarter1 = &#039;RD3-group1&#039;,&lt;br /&gt;
		quarter2 = &#039;RD3-group2&#039;,&lt;br /&gt;
		quarter3 = &#039;RD3-group3&#039;,&lt;br /&gt;
		quarter4 = &#039;RD3-group4&#039;,&lt;br /&gt;
		half1 = &#039;RD4-group1&#039;,&lt;br /&gt;
		half2 = &#039;RD4-group2&#039;,&lt;br /&gt;
		group9 = &#039;RD5-group1&#039;,&lt;br /&gt;
	}, {&lt;br /&gt;
		autoseeds = &#039;y&#039;,&lt;br /&gt;
		RD1 = &amp;quot;1st Round&amp;quot;,&lt;br /&gt;
		RD2 = &amp;quot;2nd Round&amp;quot;,&lt;br /&gt;
		RD3 = &amp;quot;3rd Round&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;list&#039;] = function (frame)&lt;br /&gt;
	local funcs={}&lt;br /&gt;
&lt;br /&gt;
	for k,_ in pairs(p) do&lt;br /&gt;
		if string.match(k, &amp;quot;^%d+Team&amp;quot;) then&lt;br /&gt;
			table.insert(funcs, k)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(funcs, function (a,b)&lt;br /&gt;
		local na, nb = tonumber(string.match(a, &amp;quot;^%d+&amp;quot;)), tonumber(string.match(b, &amp;quot;^%d+&amp;quot;))&lt;br /&gt;
		return na == nb and string.match(a, &amp;quot;^%d*(.*)$&amp;quot;) &amp;lt; string.match(b, &amp;quot;^%d*(.*)$&amp;quot;) or na &amp;lt; nb&lt;br /&gt;
	end)&lt;br /&gt;
	&lt;br /&gt;
	return frame.preprocess(frame,&lt;br /&gt;
		&amp;quot;\n* {{tl|&amp;quot;..table.concat(funcs, &amp;quot;}}\n* {{tl|&amp;quot;)..&amp;quot;}}&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;doc&#039;] = function (frame)&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	if type(p[pagename]) == &amp;quot;function&amp;quot; then&lt;br /&gt;
		return frame.preprocess(frame, &amp;quot;{{tlx|&amp;quot;..pagename..&amp;quot;}} can be &amp;quot; ..&lt;br /&gt;
			&amp;quot;replaced with {{mlx|bracket|&amp;quot;..pagename..&amp;quot;}}.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return frame.preprocess(frame, &amp;quot;In most cases, the name of the bracket &amp;quot; ..&lt;br /&gt;
		&amp;quot;template can be used as the function name for {{ml|Bracket}}, e.g. &amp;quot; ..&lt;br /&gt;
		&amp;quot;{{tlx|16TeamBracket-Compact-Tennis3}}→&amp;quot; ..&lt;br /&gt;
		&amp;quot;{{mlx|bracket|16TeamBracket-Compact-Tennis3}}.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/styles.css&amp;diff=76396</id>
		<title>Module:Build bracket/styles.css</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/styles.css&amp;diff=76396"/>
		<updated>2026-07-24T10:50:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* exact spacing baseline */&lt;br /&gt;
.brk { font-size:90%; border-collapse:separate; border-spacing:0; margin:1em 2em 0 1em; color:var(--color-base,#202122); }&lt;br /&gt;
.brk-nw { white-space:nowrap; }&lt;br /&gt;
&lt;br /&gt;
/* reset everything, then opt-in padding only where we want it */&lt;br /&gt;
.brk td, .brk th { padding:0; vertical-align:middle; }&lt;br /&gt;
.brk td.brk-td { padding:0 .3em; }  /* higher specificity than .brk td */&lt;br /&gt;
&lt;br /&gt;
/* backgrounds */&lt;br /&gt;
.brk-bgL { background-color:var(--background-color-neutral-subtle,#f8f9fa); }&lt;br /&gt;
.brk-bgD { background-color:var(--background-color-neutral,#eaecf0); }&lt;br /&gt;
&lt;br /&gt;
/* borders */&lt;br /&gt;
.brk-b { border-style:solid; border-color:#a2a9b1; }&lt;br /&gt;
&lt;br /&gt;
/* alignment + misc */&lt;br /&gt;
.brk-center { text-align:center; }&lt;br /&gt;
.brk-bold { font-weight:bold; }&lt;br /&gt;
.brk-line { border-style: solid; border-color: gray; }&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:8TeamBracket-PagePlayoff&amp;diff=76394</id>
		<title>Template:8TeamBracket-PagePlayoff</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:8TeamBracket-PagePlayoff&amp;diff=76394"/>
		<updated>2026-07-24T10:50:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Build bracket|main&lt;br /&gt;
| rounds = 4&lt;br /&gt;
| col-spacing = {{{col-spacing|{{#if:{{{RD1-RD2-cross|}}}{{{RD2-RD3-cross|}}}|12}}}}}&lt;br /&gt;
| shift = {{#if:{{{RD1-text1|}}}|1}}&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7,11,15&lt;br /&gt;
| col2-matches = 5,13&lt;br /&gt;
| col3-matches = 7,11&lt;br /&gt;
| col4-matches = 9&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = {{#if:{{{RD1-RD2-cross|}}}|7-13,11-5|7-5,11-13}},3-3,3-5:#FF3333,15-15,15-13:#FF3333&lt;br /&gt;
| col2-col3-paths = {{#if:{{{RD2-RD3-cross|}}}|(3,13)-7, (5,15)-11|(3,5)-7, (13,15)-11}}&lt;br /&gt;
| col3-col4-paths = (7,11)-9&lt;br /&gt;
| col1-col2-cross = {{#if:{{{RD1-RD2-cross|}}}|9}}&lt;br /&gt;
| col2-col3-cross = {{#if:{{{RD2-RD3-cross|}}}|9}}&lt;br /&gt;
&lt;br /&gt;
| RD1 = Qualifiers and eliminators&lt;br /&gt;
| RD2 = Repechage&lt;br /&gt;
| RD3 = Semifinals&lt;br /&gt;
| RD4 = Final&lt;br /&gt;
&lt;br /&gt;
| RD1-seed1 = 1&lt;br /&gt;
| RD1-seed2 = 4&lt;br /&gt;
| RD1-seed3 = 5&lt;br /&gt;
| RD1-seed4 = 8&lt;br /&gt;
| RD1-seed5 = 6&lt;br /&gt;
| RD1-seed6 = 7&lt;br /&gt;
| RD1-seed7 = 2&lt;br /&gt;
| RD1-seed8 = 3&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket/doc&amp;diff=76392</id>
		<title>Module:Build bracket/doc</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket/doc&amp;diff=76392"/>
		<updated>2026-07-24T10:50:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
{{high-use|| Wikipedia talk:High-risk templates}}&lt;br /&gt;
{{Module rating|release}}&lt;br /&gt;
&lt;br /&gt;
This module is intended to be used to create and edit intricate sports brackets that cannot be made by [[Module:RoundN]] or [[Module:Team bracket]]. For example, additional headers (for double-elimination brackets; 3rd-, 5th-, 7th-place matches; etc), singular omitted matches (i.e., having a horizonal line instead of a match), and &#039;&#039;N&#039;&#039;-way brackets (&#039;&#039;N&#039;&#039; teams per match). The syntax is slightly more complicated than the aforementioned brackets, but simpler than using the standard wikitable code.&lt;br /&gt;
| #default = &lt;br /&gt;
{{lua|Module:Build bracket}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds =&lt;br /&gt;
&lt;br /&gt;
| col1-headers = &lt;br /&gt;
| col1-matches = &lt;br /&gt;
&lt;br /&gt;
| col2-headers = &lt;br /&gt;
| col2-matches = &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = &lt;br /&gt;
| col2-col3-paths = &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| #default = {{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD1 =&lt;br /&gt;
| RD1-seed1   =&lt;br /&gt;
| RD1-team1   =&lt;br /&gt;
| RD1-score1  =&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
Per [[MOS:ACCESS#Font size]] and [[MOS:SMALLFONT]], &amp;quot;avoid using smaller font sizes in elements that already use a smaller font size, such as infoboxes, navboxes and reference sections&amp;quot;.  Since this template&#039;s text is already reduced to 90% of the normal size, use of the {{tl|Small}} template or {{tag|small}} tags within this template produces a font size that is 77% of the page default, well below the 85% minimum specified in the linked guidelines.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Default&lt;br /&gt;
|-&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;rounds&amp;lt;/code&amp;gt; {{!!}} number of rounds (columns). {{!!}} &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;autocol&amp;lt;/code&amp;gt; {{!!}} set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to automatically set set maximum round to display based on entries. {{!!}} &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;rows&amp;lt;/code&amp;gt; {{!!}} manually set the number of rows. {{!!}} Automatic&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;teams-per-match&amp;lt;/code&amp;gt; {{!!}} enter the number of teams in each match. Use &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-teams-per-match&amp;lt;/code&amp;gt; to set individual columns {{!!}} &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-headers&amp;lt;/code&amp;gt; {{!!}} (optional) enter the row numbers where headers are desired in column &#039;&#039;m&#039;&#039;. Separate entries with &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;. Half integer values are allowed. {{!!}} Automatic&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-matches&amp;lt;/code&amp;gt; {{!!}} enter the row numbers where a match is desired in column &#039;&#039;m&#039;&#039;. Matches take up two rows by default. Separate entries with &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;. Half integer values are allowed. {{!!}}&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-text&amp;lt;/code&amp;gt; {{!!}} enter the row numbers where additional text is desired in column &#039;&#039;m&#039;&#039;. Separate entries with &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;. Half integer values are allowed. {{!!}}&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;+1-paths&amp;lt;/code&amp;gt; {{!!}} enter the starting and ending row numbers, separated by &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, from columns &#039;&#039;m&#039;&#039; and &#039;&#039;m&#039;&#039;+1 where a path is desired. Separate entries with &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;. Half integer values are allowed. {{!!}}&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-col&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;+1-cross&amp;lt;/code&amp;gt; {{!!}} enter the row number where paths intersect from column &#039;&#039;m&#039;&#039; to &#039;&#039;m&#039;&#039;+1. {{!!}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;compact&amp;lt;/code&amp;gt; {{!!}} set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to vertically condense the bracket. {{!!}} &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-altname&amp;lt;/code&amp;gt; {{!!}} Alternate name for &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; (e.g., if {{para|RD1-altname|first}}, then &amp;lt;code&amp;gt;first-team1&amp;lt;/code&amp;gt; can be used instead of &amp;lt;code&amp;gt;RD1-team1&amp;lt;/code&amp;gt;). Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-altname&amp;lt;/code&amp;gt; for cells under header &#039;&#039;mh&#039;&#039;. {{!!}}&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;text-altname&amp;lt;/code&amp;gt; {{!!}} Alternate name for &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-text&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; (e.g., if {{para|text-altname|details}}, then &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-details1&amp;lt;/code&amp;gt; can be used instead of &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-text1&amp;lt;/code&amp;gt;). {{!!}}&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} colspan=3 {{!}}&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;maxround&amp;lt;/code&amp;gt; || final round to display. This parameter should be omitted unless it is less than the default value set by &amp;lt;code&amp;gt;rounds&amp;lt;/code&amp;gt;. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;minround&amp;lt;/code&amp;gt; || first round to display. || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt; || the amount of vertical visibility desired for the bracket. Creates a vertical scroll bar. Enter a number with units (e.g., &amp;lt;code&amp;gt;30em&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;480px&amp;lt;/code&amp;gt;). || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;col-spacing&amp;lt;/code&amp;gt; || the amount of horizontal space between rounds. Enter as a plain number (e.g., &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; for 10px). || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;seed-width&amp;lt;/code&amp;gt; || the width of the cells for seeds. Plain numbers are assumed to be in px units (e.g., &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; for 25px or &amp;lt;code&amp;gt;2em&amp;lt;/code&amp;gt; for 2em) || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;team-width&amp;lt;/code&amp;gt; || the width of the cells for team names. Plain numbers are assumed to be in px units (e.g., &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; for 200px or &amp;lt;code&amp;gt;15em&amp;lt;/code&amp;gt; for 15em) || &amp;lt;code&amp;gt;150&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;score-width&amp;lt;/code&amp;gt; || the width of the cells for scores. Plain numbers are assumed to be in px units (e.g., &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; for 25px or &amp;lt;code&amp;gt;2em&amp;lt;/code&amp;gt; for 2em) || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;agg-width&amp;lt;/code&amp;gt; || the width of the cells for aggregate scores. &amp;lt;code&amp;gt;score-width&amp;lt;/code&amp;gt; will change aggregate score widths unless this parameter is used. Plain numbers are assumed to be in px units (e.g., &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; for 25px or &amp;lt;code&amp;gt;2em&amp;lt;/code&amp;gt; for 2em) || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;seeds&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt; to omit seeds in in all matches. set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to show seed cells to show for all matches. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;legs&amp;lt;/code&amp;gt; || the number of legs for all rounds. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-legs&amp;lt;/code&amp;gt; to individually set columns. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-legs&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; to individually set teams. || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;autolegs&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to automatically generate score cells per team. If &amp;lt;code&amp;gt;legs&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-legs&amp;lt;/code&amp;gt; is used, &amp;lt;code&amp;gt;autolegs&amp;lt;/code&amp;gt; will be set to &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt; .|| &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;byes&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to hide any team cells that are empty. Alternatively, set to &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; to have rounds &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; hide any team cells that are empty. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-byes&amp;lt;/code&amp;gt; for just matches under column &#039;&#039;m&#039;&#039;. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-byes&amp;lt;/code&amp;gt; for just matches under header &#039;&#039;h&#039;&#039; only in column &#039;&#039;m&#039;&#039;. || &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-hide&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to hide the all matches in columns &#039;&#039;m&#039;&#039; unless any of those entries are non empty. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-byes&amp;lt;/code&amp;gt; to hide the (alpha) &#039;&#039;h&#039;&#039;th header and all matches beneath it in column &#039;&#039;m&#039;&#039;. Useful for consolation matches. {{!!}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;show-bye-paths&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to replace any team cells that that are hidden &amp;lt;code&amp;gt;byes&amp;lt;/code&amp;gt; with a path. || &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-score&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;-shade&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-score&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;-&amp;lt;i&amp;gt;l&amp;lt;/i&amp;gt;-shade&amp;lt;/code&amp;gt; || the background color (in hex format, e.g. &amp;lt;code&amp;gt;#ABCDEF&amp;lt;/code&amp;gt;) the (&#039;&#039;l&#039;&#039;th leg of) &#039;&#039;k&#039;&#039;th team&#039;s score column &#039;&#039;m&#039;&#039;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; || Set to &amp;lt;code&amp;gt;sets&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;legs&amp;lt;/code&amp;gt; to sum the sets/legs won and append to the end of the scores. Set to &amp;lt;code&amp;gt;score&amp;lt;/code&amp;gt; to sum the scores from each set/leg and append to the end of the scores. Set to &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; to enable the &amp;lt;code&amp;gt;-agg&amp;lt;/code&amp;gt; suffix, but without any auto computation. Only works when there are two or more legs/sets in the round. Any automatically computed value can be overridden by setting the value manually with the &amp;lt;code&amp;gt;-agg&amp;lt;/code&amp;gt; suffix for the score. || &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;boldwinner&amp;lt;/code&amp;gt; || set to &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; to automatically bold the seed/team/score with the higher score in each match. Set to &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; for the lowest score. Set to &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; to only bold the higher aggregate score. Set to &amp;lt;code&amp;gt;aggregate-low&amp;lt;/code&amp;gt; to only bold the lower aggregate score. || &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;shift&amp;lt;/code&amp;gt; || vertically shifts all of the entries by the number entered. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-shift&amp;lt;/code&amp;gt; for individual in columns. || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=3 | &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The header text of the (alpha &#039;&#039;h&#039;&#039;th) header in column &#039;&#039;m&#039;&#039; (e.g., &amp;lt;code&amp;gt;RD1&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;RD1a&amp;lt;/code&amp;gt; for the first header and &amp;lt;code&amp;gt;RD1b&amp;lt;/code&amp;gt; for the second header in column 1). || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-seed&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The seed of the &#039;&#039;k&#039;&#039;th team in column &#039;&#039;m&#039;&#039;. Alternatively, use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-seed&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; for the &#039;&#039;k&#039;&#039;th team under header &#039;&#039;mh&#039;&#039;. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-team&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The name of the &#039;&#039;k&#039;&#039;th team in column &#039;&#039;m&#039;&#039;. Alternatively, use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-team&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; for the &#039;&#039;k&#039;&#039;th team under header &#039;&#039;mh&#039;&#039;. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-score&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The score of the &#039;&#039;k&#039;&#039;th team in column &#039;&#039;m&#039;&#039;. Alternatively, use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-score&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; for the &#039;&#039;k&#039;&#039;th team under header &#039;&#039;mh&#039;&#039;. Append the suffix &amp;lt;code&amp;gt;-&amp;lt;i&amp;gt;l&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; for the &#039;&#039;l&#039;&#039;th leg or &amp;lt;code&amp;gt;-agg&amp;lt;/code&amp;gt; for the aggregate score. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-text&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The text above the &#039;&#039;k&#039;&#039;th match in column &#039;&#039;m&#039;&#039;. Alternatively, use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-text&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; for the &#039;&#039;k&#039;&#039;th match under header &#039;&#039;mh&#039;&#039;. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-group&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; || The text for the &#039;&#039;k&#039;&#039;th group in column &#039;&#039;m&#039;&#039;. Group text will appear to the left of whenever two paths meet. || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD-shade&amp;lt;/code&amp;gt; || the background color (in hex format, e.g. &amp;lt;code&amp;gt;#ABCDEF&amp;lt;/code&amp;gt;) of all headers. Use &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-shade&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;mh&amp;lt;/i&amp;gt;-shade&amp;lt;/code&amp;gt; for individual headers. || &amp;lt;code&amp;gt;#F2F2F2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-RD(&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;+1)-path&amp;lt;/code&amp;gt;{{efn|name=note1}} || set to &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; to omit the paths from round &#039;&#039;m&#039;&#039; to round &#039;&#039;m&#039;&#039;+1. || &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;paramstyle&amp;lt;/code&amp;gt;{{efn|name=note2}} || set to &amp;lt;code&amp;gt;numbered&amp;lt;/code&amp;gt; change the parameter name style of &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-text&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-seed&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-team&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;RD&amp;lt;i&amp;gt;m&amp;lt;/i&amp;gt;-score&amp;lt;i&amp;gt;k&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; to a numbered notation ({{para|1}},{{para|2}}...). Set {{para|seeds|yes}} add seeds. ||&lt;br /&gt;
|}&lt;br /&gt;
{{notelist|refs=&lt;br /&gt;
  {{efn|name=note1|Does not currently work for paths under subheaders.}}&lt;br /&gt;
  {{efn|name=note2|&amp;lt;code&amp;gt;numbered&amp;lt;/code&amp;gt; may not be compatible with certain other features, e.g. groups.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Parameter hierarchy ===&lt;br /&gt;
*Whenever there are multiple headers in a single column, more than one parameter may be assigned to a cell value. For example, in the following bracket, both {{para|RD1-team3}} and {{para|RD1b-team1}} can be used to assign the third team in the first column. By default, entries with subheader prefixes will override those without. In the below example, &amp;lt;code&amp;gt;RD1b-team1&amp;lt;/code&amp;gt; will override any value that has been set by &amp;lt;code&amp;gt;RD1-team3&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds = 1&lt;br /&gt;
| col1-headers = 1,6&lt;br /&gt;
| col1-matches = 3,8&lt;br /&gt;
| RD1 = Upper round&lt;br /&gt;
| RD1b = Lower round&lt;br /&gt;
| RD1-team3 = &amp;lt;code&amp;gt;RD1-team3&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;RD1b-team1&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
*Parameters used in articles take precedence over parameters used in the template itself. For example, suppose ArticleX used the template NTeamBracket, and suppose NTeamBracket had the parameter {{para|RD1-seed1|1}} set. If ArticleX implemented &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{NTeamBracket|RD1-seed1=2}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, then the first team in round 1 would have a seed of 2.&lt;br /&gt;
&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
=== Path codes ===&lt;br /&gt;
Path codes are entered in the form &amp;lt;code&amp;gt;a-b&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is associated match in the first column, and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is associated match in the second column. Path codes can be grouped; for example, &amp;lt;code&amp;gt;(a,b)-c&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;a-c, b-c&amp;lt;/code&amp;gt;. To add color, append &amp;lt;code&amp;gt;:&#039;&#039;color&#039;&#039;&amp;lt;/code&amp;gt; to the end of a path, e.g. &amp;lt;code&amp;gt;3-5:red&amp;lt;/code&amp;gt;. Only one extra color can be used in a bracket.&lt;br /&gt;
{{wikitable| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Example !! Output&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;1-3&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{#invoke:Build bracket|main|rounds=2|noheaders=yes|col1-matches=1|col2-matches=3|col1-col2-paths=1-3}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;(1,5)-3&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{#invoke:Build bracket|main|rounds=2|noheaders=yes|col1-matches=1,5|col2-matches=3|col1-col2-paths=(1,5)-3}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;3-1,3-5:red&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{#invoke:Build bracket|main|rounds=2|noheaders=yes|col1-matches=3|col2-matches=1,5|col1-col2-paths=3-1,3-5:red}}&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: These are only examples to illustrate parameters. Standard 4-team, 8-team, etc. brackets are better handled by [[Module:Team bracket]].&lt;br /&gt;
&lt;br /&gt;
=== Standard 4-team bracket ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1&lt;br /&gt;
| col2-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Defaults --&amp;gt;&lt;br /&gt;
| RD2 = Grand Final&lt;br /&gt;
&lt;br /&gt;
| RD1-seed1 = 1&lt;br /&gt;
| RD1-seed3 = 2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1&lt;br /&gt;
| col2-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Defaults --&amp;gt;&lt;br /&gt;
| RD2 = Grand Final&lt;br /&gt;
&lt;br /&gt;
| RD1-seed1 = 1&lt;br /&gt;
| RD1-seed3 = 2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 3-way bracket ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| teams-per-match = 3&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1&lt;br /&gt;
| col2-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7,11&lt;br /&gt;
| col2-matches = 7&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,7,11)-7&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| teams-per-match = 3&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1&lt;br /&gt;
| col2-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7,11&lt;br /&gt;
| col2-matches = 7&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,7,11)-7&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Double-elimination bracket ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=4&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1,7&lt;br /&gt;
| col2-headers = 1,7&lt;br /&gt;
| col3-headers = 7&lt;br /&gt;
| col4-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 4,11&lt;br /&gt;
| col2-matches = 3,10&lt;br /&gt;
| col3-matches = 9&lt;br /&gt;
| col4-matches = 6&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = 4-3, 11-10&lt;br /&gt;
| col2-col3-paths = 3-3, 10-9&lt;br /&gt;
| col3-col4-paths = (3,9)-6&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Defaults --&amp;gt;&lt;br /&gt;
| RD1 = Upper round 1&lt;br /&gt;
| RD2 = Upper final&lt;br /&gt;
| RD3b = Lower final&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=4&lt;br /&gt;
&lt;br /&gt;
| col1-headers = 1,7&lt;br /&gt;
| col2-headers = 1,7&lt;br /&gt;
| col3-headers = 7&lt;br /&gt;
| col4-headers = 1&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 4,11&lt;br /&gt;
| col2-matches = 3,10&lt;br /&gt;
| col3-matches = 9&lt;br /&gt;
| col4-matches = 6&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = 4-3, 11-10&lt;br /&gt;
| col2-col3-paths = 3-3, 10-9&lt;br /&gt;
| col3-col4-paths = (3,9)-6&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Defaults --&amp;gt;&lt;br /&gt;
| RD1 = Upper round 1&lt;br /&gt;
| RD2 = Upper final&lt;br /&gt;
| RD3b = Lower final&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Crossing paths ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 3,7&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = 3-7, 7-3&lt;br /&gt;
| col1-col2-cross = 5&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 3,7&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = 3-7, 7-3&lt;br /&gt;
| col1-col2-cross = 5&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Text ===&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| col1-matches = 3,6&lt;br /&gt;
| col2-matches = 4.5&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5&lt;br /&gt;
&lt;br /&gt;
| RD1-text1 = Text 1&lt;br /&gt;
| RD1-text2 = Text 2&lt;br /&gt;
| RD2-text1 = Text 3&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| col1-matches = 3,6&lt;br /&gt;
| col2-matches = 4.5&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5&lt;br /&gt;
&lt;br /&gt;
| RD1-text1 = Text 1&lt;br /&gt;
| RD1-text2 = Text 2&lt;br /&gt;
| RD2-text1 = Text 3&lt;br /&gt;
}}&lt;br /&gt;
|#default =&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD1-text1 = Text 1&lt;br /&gt;
| RD1-text2 = Text 2&lt;br /&gt;
| RD2-text1 = Text 3&lt;br /&gt;
| RD1 =&lt;br /&gt;
| RD1-seed1   =&lt;br /&gt;
| RD1-team1   =&lt;br /&gt;
| RD1-score1  =&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{#if:{{{limitexamples|}}}|void|{{BASEPAGENAME}}}}|RD1-text1=Text 1|RD1-text2=Text 2|RD2-text1=Text 3}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Groups ===&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
&lt;br /&gt;
| RD1-group1 = Group 1&lt;br /&gt;
| RD1-group2 = Group 2&lt;br /&gt;
| RD2-group1 = Group 3&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
&lt;br /&gt;
| RD1-group1 = Group 1&lt;br /&gt;
| RD1-group2 = Group 2&lt;br /&gt;
| RD2-group1 = Group 3&lt;br /&gt;
}}&lt;br /&gt;
|#default =&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD1-group1 = Group 1&lt;br /&gt;
| RD1-group2 = Group 2&lt;br /&gt;
| RD2-group1 = Group 3&lt;br /&gt;
| RD1 =&lt;br /&gt;
| RD1-seed1   =&lt;br /&gt;
| RD1-team1   =&lt;br /&gt;
| RD1-score1  =&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{#if:{{{limitexamples|}}}|void|{{BASEPAGENAME}}}}|RD1-group1=Group 1|RD1-group2=Group 2|RD2-group1=Group 3}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Legs and aggregate ===&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| legs = 2&lt;br /&gt;
| RD1-legs = 3&lt;br /&gt;
| aggregate = y&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| legs = 2&lt;br /&gt;
| RD1-legs = 3&lt;br /&gt;
| aggregate = y&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
}}&lt;br /&gt;
|#default =&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| legs = 2&lt;br /&gt;
| RD1-legs = 3&lt;br /&gt;
| aggregate = y&lt;br /&gt;
| RD1 =&lt;br /&gt;
| RD1-seed1   =&lt;br /&gt;
| RD1-team1   =&lt;br /&gt;
| RD1-score1-1=&lt;br /&gt;
| RD1-score1-2=&lt;br /&gt;
| RD1-score1-3=&lt;br /&gt;
| RD1-score1-agg=&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{#if:{{{limitexamples|}}}|void|{{BASEPAGENAME}}}}|legs=2|RD1-legs=3|aggregate=y}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Byes ===&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| RD1-byes = y&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
&lt;br /&gt;
| RD1-team1 = Team 1&lt;br /&gt;
| RD1-team2 = Team 2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=3&lt;br /&gt;
| RD1-byes = y&lt;br /&gt;
&lt;br /&gt;
| col1-matches = 3,6,9,12&lt;br /&gt;
| col2-matches = 4.5,10.5&lt;br /&gt;
| col3-matches = 7.5&lt;br /&gt;
&lt;br /&gt;
| col1-col2-paths = (3,6)-4.5, (9,12)-10.5&lt;br /&gt;
| col2-col3-paths = (4.5,10.5)-7.5&lt;br /&gt;
&lt;br /&gt;
| RD1-team1 = Team 1&lt;br /&gt;
| RD1-team2 = Team 2&lt;br /&gt;
}}&lt;br /&gt;
|#default =&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD1-byes = y&lt;br /&gt;
| RD1 =&lt;br /&gt;
| RD1-seed1   =&lt;br /&gt;
| RD1-team1   = Team 1&lt;br /&gt;
| RD1-score1  =&lt;br /&gt;
| RD1-seed2   =&lt;br /&gt;
| RD1-team2   = Team 2&lt;br /&gt;
| RD1-score2  =&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{#if:{{{limitexamples|}}}|void|{{BASEPAGENAME}}}}|RD1-byes=y|RD1-team1=Team 1|RD1-team2=Team 2}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Numbered parameters ===&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
| paramstyle = numbered&lt;br /&gt;
| seeds = yes&lt;br /&gt;
&lt;br /&gt;
| Text 1 | 1 | Team 1 | 5 | 4 | Team 2 | 11&lt;br /&gt;
| Text 2 | 2 | Team 3 | 6 | 3 | Team 4 | 3&lt;br /&gt;
&lt;br /&gt;
| Text 3 | 4 | Team 2 | 2 | 2 | Team 3 | 1 &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
| paramstyle = numbered&lt;br /&gt;
| seeds = yes&lt;br /&gt;
&lt;br /&gt;
| Text 1 | 1 | Team 1 | 5 | 4 | Team 2 | 11&lt;br /&gt;
| Text 2 | 2 | Team 3 | 6 | 3 | Team 4 | 3&lt;br /&gt;
&lt;br /&gt;
| Text 3 | 4 | Team 2 | 2 | 2 | Team 3 | 1 &lt;br /&gt;
}}&lt;br /&gt;
|#default =&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| paramstyle = numbered&lt;br /&gt;
| RD1 =&lt;br /&gt;
&lt;br /&gt;
| Text 1 | Team 1 | S1 | Team 2 | S2&lt;br /&gt;
| Text 2 | Team 3 | S3 | Team 4 | S4&lt;br /&gt;
 ...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{#if:{{{limitexamples|}}}|void|{{BASEPAGENAME}}}}|paramstyle=numbered|1=Text 1|2=Team 1|3=S1 |4=Team 2|5=S2|6=Text 2|7=Team 3|8=S3|9=Team 4|10=S4}}&lt;br /&gt;
}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
=== Bold winner ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| legs = 3&lt;br /&gt;
| boldwinner=y&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
| RD1-seed1 = 1 | RD1-team1 = Team 1 | RD1-score1-1 = 5  | RD1-score1-2 = 12 | RD1-score1-3 = 15&lt;br /&gt;
| RD1-seed2 = 4 | RD1-team2 = Team 2 | RD1-score2-1 = 11 | RD1-score2-2 = 10 | RD1-score2-3 = 4&lt;br /&gt;
&lt;br /&gt;
| RD1-seed3 = 2 | RD1-team3 = Team 3 | RD1-score3-1 = 6  | RD1-score3-2 = 13 | RD1-score3-3 = {{ndash}}&lt;br /&gt;
| RD1-seed4 = 3 | RD1-team4 = Team 4 | RD1-score4-1 = 3  | RD1-score4-2 = 2  | RD1-score4-3 = {{ndash}}&lt;br /&gt;
&lt;br /&gt;
| RD2-seed1 = 4 | RD2-team1 = Team 2 | RD2-score1-1 = 2  | RD2-score1-2 = 2  | RD2-score1-3 = 5&lt;br /&gt;
| RD2-seed2 = 2 | RD2-team2 = Team 3 | RD2-score2-1 = 1  | RD2-score2-2 = 7  | RD2-score2-3 = 2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{#invoke:Build bracket|main&lt;br /&gt;
| rounds=2&lt;br /&gt;
| legs = 3&lt;br /&gt;
| boldwinner=y&lt;br /&gt;
| col1-matches = 3,7&lt;br /&gt;
| col2-matches = 5&lt;br /&gt;
| col1-col2-paths = (3,7)-5&lt;br /&gt;
&lt;br /&gt;
| RD1-seed1 = 1 | RD1-team1 = Team 1 | RD1-score1-1 = 5  | RD1-score1-2 = 12 | RD1-score1-3 = 15&lt;br /&gt;
| RD1-seed2 = 4 | RD1-team2 = Team 2 | RD1-score2-1 = 11 | RD1-score2-2 = 10 | RD1-score2-3 = 4&lt;br /&gt;
&lt;br /&gt;
| RD1-seed3 = 2 | RD1-team3 = Team 3 | RD1-score3-1 = 6  | RD1-score3-2 = 13 | RD1-score3-3 = {{ndash}}&lt;br /&gt;
| RD1-seed4 = 3 | RD1-team4 = Team 4 | RD1-score4-1 = 3  | RD1-score4-2 = 2  | RD1-score4-3 = {{ndash}}&lt;br /&gt;
&lt;br /&gt;
| RD2-seed1 = 4 | RD2-team1 = Team 2 | RD2-score1-1 = 2  | RD2-score1-2 = 2  | RD2-score1-3 = 5&lt;br /&gt;
| RD2-seed2 = 2 | RD2-team2 = Team 3 | RD2-score2-1 = 1  | RD2-score2-2 = 7  | RD2-score2-3 = 2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
|#default=&lt;br /&gt;
{{{examples|}}}&lt;br /&gt;
}}&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
| Module = &lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Module:Team bracket]]&lt;br /&gt;
* [[Module:RoundN]]&lt;br /&gt;
* [[Module:Bracket]]&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#ifeq:{{SUBPAGENAME}}|sandbox||&lt;br /&gt;
&amp;lt;!-- Categories go here, and interwikis go in Wikidata --&amp;gt;&lt;br /&gt;
[[Category:Sports modules]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
| #default = &lt;br /&gt;
==Alternatives to avoid Wikipedia&#039;s [[WP:PEIS|Post-expand include size]] limit==&lt;br /&gt;
Pages with many brackets or large brackets, especially those containing flag icons, may come close to or exceed Wikipedia&#039;s [[WP:PEIS|Post-expand include size]] limit.  In these cases consider using modules directly instead:&lt;br /&gt;
* {{#invoke:Bracket|doc}}&lt;br /&gt;
* In most cases, flag templates can be replaced with {{ml|flag}}, e.g. {{tlx|flag|CAN}}→{{mlx|flag|{{!}}CAN}} or {{tlx|flag athlete|CAN}}→{{mlx|flag|athlete|CAN}}.&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{see also|}}}|&lt;br /&gt;
== See also ==&lt;br /&gt;
{{{see also|* {{tl|Build bracket}}}}}&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Module documentation pages]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Module:Build_bracket&amp;diff=76390</id>
		<title>Module:Build bracket</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Module:Build_bracket&amp;diff=76390"/>
		<updated>2026-07-24T10:50:35Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Submodules&lt;br /&gt;
local Helpers = require(&amp;quot;Module:Build bracket/Helpers&amp;quot;)&lt;br /&gt;
local Config = require(&amp;quot;Module:Build bracket/Config&amp;quot;)&lt;br /&gt;
local Params = require(&amp;quot;Module:Build bracket/Params&amp;quot;)&lt;br /&gt;
local StateChecks = require(&amp;quot;Module:Build bracket/StateChecks&amp;quot;)&lt;br /&gt;
local Logic = require(&amp;quot;Module:Build bracket/Logic&amp;quot;)&lt;br /&gt;
local Paths = require(&amp;quot;Module:Build bracket/Paths&amp;quot;)&lt;br /&gt;
local Render = require(&amp;quot;Module:Build bracket/Render&amp;quot;)&lt;br /&gt;
-- local Deprecations = require(&#039;Module:Build bracket/Deprecations&#039;)&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    -- Shared mutable state passed among submodules&lt;br /&gt;
    local state = {&lt;br /&gt;
        headerindex = {},&lt;br /&gt;
        rlegs = {},&lt;br /&gt;
        maxlegs = {},&lt;br /&gt;
        hascross = {},&lt;br /&gt;
        crossCell = {},&lt;br /&gt;
        pathCell = {},&lt;br /&gt;
        skipPath = {},&lt;br /&gt;
        hide = {},&lt;br /&gt;
        byes = {},&lt;br /&gt;
        teamsPerMatch = {},&lt;br /&gt;
        matchgroup = {},&lt;br /&gt;
        maxtpm = 0&lt;br /&gt;
    }&lt;br /&gt;
    local config = {}&lt;br /&gt;
&lt;br /&gt;
    -- 1) Parse args &amp;amp; set config (also installs arg accessors on Helpers)&lt;br /&gt;
    Config.init(frame, state, config, Helpers)&lt;br /&gt;
&lt;br /&gt;
    -- 2) Bind StateChecks (used by Params/Logic/Paths/Render)&lt;br /&gt;
    StateChecks.bind(state, config, Helpers)&lt;br /&gt;
&lt;br /&gt;
    -- 3) Build entries skeleton from args (headers/teams/text/lines/groups)&lt;br /&gt;
    Params.buildSkeleton(state, config, Helpers, StateChecks)&lt;br /&gt;
&lt;br /&gt;
    -- 4) Discover indices/byes/hide across the skeleton&lt;br /&gt;
    Params.scanStructure(state, config, Helpers, StateChecks)&lt;br /&gt;
&lt;br /&gt;
    -- 5) assign per-entry params&lt;br /&gt;
    Params.assign(state, config, Helpers, StateChecks)&lt;br /&gt;
&lt;br /&gt;
    -- 5.5) apply minround slicing (reindex to start at 1)&lt;br /&gt;
    Params.sliceForMinround(state, config)&lt;br /&gt;
&lt;br /&gt;
    -- 6) Logic passes (max legs, grouping, aggregates, bolding)&lt;br /&gt;
    Logic.updateMaxLegs(state, config, Helpers)&lt;br /&gt;
    Logic.matchGroups(state, config)&lt;br /&gt;
    Logic.computeAggregate(state, config, Helpers, StateChecks)&lt;br /&gt;
    Logic.boldWinner(state, config, Helpers, StateChecks)&lt;br /&gt;
&lt;br /&gt;
    -- 7) paths + derive groups from paths&lt;br /&gt;
    Paths.build(state, config, Helpers, StateChecks)&lt;br /&gt;
    Paths.attachGroups(state, config, Helpers, StateChecks)&lt;br /&gt;
&lt;br /&gt;
    -- (Harmless guard if user passed odd ranges)&lt;br /&gt;
    if (tonumber(config.c) or 1) &amp;lt; (tonumber(config.minc) or 1) then&lt;br /&gt;
        config.c = config.minc&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 8) Render HTML table&lt;br /&gt;
    local html = Render.buildTable(frame, state, config, Helpers, StateChecks)&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Exposed for tests/scripts that invoke without a frame&lt;br /&gt;
p._main = p.main&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Parameter&amp;diff=76388</id>
		<title>Template:Parameter</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Parameter&amp;diff=76388"/>
		<updated>2026-07-24T10:50:34Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{plain|}}}{{{mxt|}}}{{{green|}}}{{{!mxt|}}}{{{red|}}}{{{color|}}}&lt;br /&gt;
	| &amp;lt;code class=&amp;quot;tpl-para&amp;quot; style=&amp;quot;word-break:break-word;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{plain|}}}&lt;br /&gt;
		| border: none; background-color: inherit;&lt;br /&gt;
	}} {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{color|}}}&lt;br /&gt;
		| color: {{{color}}};&lt;br /&gt;
		| {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{mxt|}}}{{{green|}}}&lt;br /&gt;
			| color: #006400;&lt;br /&gt;
			| {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{!mxt|}}}{{{red|}}}&lt;br /&gt;
				| color: #8B0000;&lt;br /&gt;
				| color: inherit;&lt;br /&gt;
			}}&lt;br /&gt;
		}}&lt;br /&gt;
	}} {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{style|}}}|{{{style}}}}}&amp;quot;&amp;gt;&amp;amp;#124;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{1|}}}&lt;br /&gt;
		| {{{1}}}&amp;amp;#61;&lt;br /&gt;
	}}{{{2|}}}&amp;lt;/code&amp;gt;&lt;br /&gt;
	| &amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; inline style=&amp;quot;display: none;&amp;quot; /&amp;gt;&amp;lt;!-- required to fetch syntaxhighlight&#039;s css --&amp;gt;&amp;lt;code class=&amp;quot;mw-highlight&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;p&amp;quot;&amp;gt;&amp;amp;#124;&amp;lt;/span&amp;gt;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{1|}}}&lt;br /&gt;
		| &amp;lt;span class=&amp;quot;nl&amp;quot;&amp;gt;{{{1}}}&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;o&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt;&lt;br /&gt;
	}}{{{2|}}}&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go near the bottom of the /doc subpage – interwikis go to Wikidata, thank you! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Ml&amp;diff=76386</id>
		<title>Template:Ml</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Ml&amp;diff=76386"/>
		<updated>2026-07-24T10:50:34Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Module link]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Lua&amp;diff=76384</id>
		<title>Template:Lua</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Lua&amp;diff=76384"/>
		<updated>2026-07-24T10:50:34Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template for discussion/dated|action=|page=Lua|otherpage=|link=Wikipedia:Templates for discussion/Log/2026 July 24#Template:Lua|type=sidebar|help=off|bigbox={{#invoke:Noinclude|noinclude|text=yes}}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#invoke:Lua banner|main}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Lua|Module:Lua banner}}&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Template_for_discussion/dated&amp;diff=76382</id>
		<title>Template:Template for discussion/dated</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Template_for_discussion/dated&amp;diff=76382"/>
		<updated>2026-07-24T10:50:33Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SAFESUBST:&amp;lt;noinclude /&amp;gt;#invoke:Unsubst||type= |page= |link= |help= |$B={{#ifeq:{{{bigbox|&amp;lt;noinclude&amp;gt;yes&amp;lt;/noinclude&amp;gt;}}}|yes|{{#invoke:Message box|ombox&lt;br /&gt;
  |class = mbox-tfd&lt;br /&gt;
  |type  = delete&lt;br /&gt;
  |image = none&lt;br /&gt;
  |small = {{{small|no}}}&lt;br /&gt;
  |text  = This {{#ifeq:{{lc:{{{type}}}}}|module|[[Help:Module|module]]|[[Help:Template|template]]}} is being discussed {{#if:{{{action|}}}|for {{{action}}}|in accordance with Wikipedia&#039;s [[Wikipedia:Deletion policy|deletion policy]]}}. Help reach a consensus at [[{{{link}}}|&#039;&#039;&#039;its entry&#039;&#039;&#039;]].&lt;br /&gt;
{{#ifeq:{{{help}}}|off||----&lt;br /&gt;
&#039;&#039;&amp;lt;small class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;line-height:1.3em;&amp;quot;&amp;gt;[[Wikipedia:Maintenance|Maintenance]] use only:&amp;lt;br /&amp;gt;1. [{{fullurl:{{{link}}}|action=edit&amp;amp;editintro=Wikipedia:Templates_for_discussion/editnotice&amp;amp;section=1}} Edit the TfD log] to create the discussion entry.&amp;lt;br /&amp;gt;2. Please consider notifying the [{{fullurl:{{FULLPAGENAME}}|action=history}} author(s)] by placing &amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;{{#Invoke:Template link general|main|code=on|subst=on|{{#ifeq:{{lc:{{{action}}}}}|rename|TfR|{{#ifeq:{{lc:{{{action}}}}}|renaming|TfR|{{#ifeq:{{lc:{{{action}}}}}|move|TfR|{{#ifeq:{{lc:{{{action}}}}}|moving|TfR|TfD}}}}}}}} notice|{{PAGENAME}}{{#ifeq:{{lc:{{{type}}}}}|module|{{!}}module=yes}}}} &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt; on their talk page(s).&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
 }}}}{{#invoke:Category handler|main&lt;br /&gt;
  | all = [[Category:Templates for deletion]]&lt;br /&gt;
  | nocat = {{{nocat|{{#ifeq:{{Template:FULLBASEPAGENAME|{{FULLBASEPAGENAME}}}}|Template:Template for discussion|true}}|true}}}&lt;br /&gt;
  | category2 = {{{category|¬}}}&lt;br /&gt;
 }}&amp;lt;span id=&amp;quot;delete-reason&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;{{URLENCODE:[[{{{link}}}]]}}&amp;lt;/span&amp;gt;&amp;lt;span id=&amp;quot;delete-criterion&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
|{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |tiny = &amp;lt;templatestyles src=&amp;quot;Template:Template for discussion/styles.css&amp;quot; /&amp;gt;&amp;lt;span class=&amp;quot;noprint tfd tfd-dated tfd-tiny {{#ifeq:{{{dedup|}}}|no||tfd-dedup}}&amp;quot;&amp;gt;[[{{{link}}}|‹See Tfd›]]&amp;lt;/span&amp;gt;&lt;br /&gt;
 |inline = &amp;lt;templatestyles src=&amp;quot;Template:Template for discussion/styles.css&amp;quot; /&amp;gt;&amp;lt;span class=&amp;quot;noprint {{#ifeq:{{{dedup|}}}|no||tfd-dedup}}&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;tfd tfd-dated tfd-inline&amp;quot;&amp;gt;‹The [[Help:Template|template]] &#039;&#039;[[Template:{{{page}}}|{{{page}}}]]&#039;&#039; is being [[{{{link}}}|considered for {{if empty|{{{action|}}}|deletion}}]].›&amp;lt;/span&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
 |infobox|box|sidebar = &amp;lt;templatestyles src=&amp;quot;Template:Template for discussion/styles.css&amp;quot; /&amp;gt;&amp;lt;div class=&amp;quot;boilerplate metadata plainlinks tfd tfd-dated tfd-sidebar navigation-not-searchable {{#ifeq:{{{dedup|}}}|no||tfd-dedup}}&amp;quot; id=&amp;quot;tfd{{urlencode:{{{page}}}|WIKI}}&amp;quot;&amp;gt;‹&amp;amp;nbsp;The [[Help:Template|template]] &#039;&#039;[[Template:{{{page}}}|{{{page}}}]]&#039;&#039; is being [[{{{link}}}|considered for {{if empty|{{{action|}}}|deletion}}]].&amp;amp;nbsp;›&amp;lt;/div&amp;gt;&lt;br /&gt;
 |hide|disabled = &amp;lt;noinclude&amp;gt;&amp;lt;!-- No output --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
 |#default = &amp;lt;templatestyles src=&amp;quot;Template:Template for discussion/styles.css&amp;quot; /&amp;gt;&amp;lt;div class=&amp;quot;boilerplate metadata plainlinks tfd tfd-dated tfd-default navigation-not-searchable {{#ifeq:{{{dedup|}}}|no||tfd-dedup}}&amp;quot; id=&amp;quot;tfd{{urlencode:{{{page}}}|WIKI}}&amp;quot;&amp;gt;‹&amp;amp;nbsp;The [[Help:Template|template]] below (&#039;&#039;[[Template:{{{page}}}|{{{page}}}]]&#039;&#039;) is being considered for {{if empty|{{{action|}}}|deletion}}{{#if:{{{otherpage|}}}|&amp;amp;#32;to {{{otherpage|}}}}}. See [[{{{link}}}|templates for discussion]] to help reach a consensus.&amp;amp;nbsp;›&amp;lt;/div&amp;gt;&lt;br /&gt;
}}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage, please, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Tag&amp;diff=76380</id>
		<title>Template:Tag</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Tag&amp;diff=76380"/>
		<updated>2026-07-24T10:50:32Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code class=&amp;quot;{{#ifeq:{{{wrap|}}}|yes|wrap|nowrap}}&amp;quot; style=&amp;quot;{{#ifeq:{{{style|}}}|plain|border:none;background:transparent;color:inherit;|{{{style|}}}}}&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
 Opening tag&lt;br /&gt;
--&amp;gt;{{#switch:{{{2|pair}}}&lt;br /&gt;
  |c|close =&lt;br /&gt;
  |e|empty|s|single|v|void&lt;br /&gt;
  |o|open&lt;br /&gt;
  |p|pair = &amp;amp;lt;{{#if:{{{link|}}}|[[HTML element#{{{1|tag}}}|{{{1|tag}}}]]|{{{1|tag}}}}}{{#if:{{{params|{{{attribs|}}}}}}|&amp;amp;#32;{{{params|{{{attribs}}}}}}}}&lt;br /&gt;
 }}&amp;lt;!--&lt;br /&gt;
 Content between tags&lt;br /&gt;
--&amp;gt;{{#switch:{{{2|pair}}}&lt;br /&gt;
  |c|close = {{{content|}}}&lt;br /&gt;
  |e|empty|s|single|v|void = &amp;amp;#32;&amp;amp;#47;&amp;amp;gt;&lt;br /&gt;
  |o|open = &amp;amp;gt;{{{content|}}}&lt;br /&gt;
  |p|pair = {{#ifeq:{{{1|tag}}}|!--||&amp;amp;gt;}}{{{content|...}}}&lt;br /&gt;
 }}&amp;lt;!--&lt;br /&gt;
 Closing tag&lt;br /&gt;
--&amp;gt;{{#switch:{{{2|pair}}}&lt;br /&gt;
  |e|empty|s|single|v|void&lt;br /&gt;
  |o|open =&lt;br /&gt;
  |c|close&lt;br /&gt;
  |p|pair = {{#ifeq:{{{1|tag}}}|!--|--&amp;amp;gt;|&amp;amp;lt;&amp;amp;#47;{{{1|tag}}}&amp;amp;gt;}}&lt;br /&gt;
 }}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Notelist&amp;diff=76378</id>
		<title>Template:Notelist</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Notelist&amp;diff=76378"/>
		<updated>2026-07-24T10:50:32Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{safesubst&amp;lt;noinclude /&amp;gt;:reflist|{{{1|{{{colwidth|}}}}}}|refs={{{refs|{{{notes|}}}}}}|group={{safesubst&amp;lt;noinclude /&amp;gt;:#switch: {{{group|}}}&lt;br /&gt;
    | note&lt;br /&gt;
    | upper-alpha&lt;br /&gt;
    | upper-roman&lt;br /&gt;
    | lower-alpha&lt;br /&gt;
    | lower-greek&lt;br /&gt;
    | lower-roman = {{{group|}}}&lt;br /&gt;
    | #default = lower-alpha&lt;br /&gt;
   }}}}{{safesubst&amp;lt;noinclude /&amp;gt;:#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using notelist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Notelist]] with unknown parameter &amp;quot;_VALUE_&amp;quot;|ignoreblank=y| 1 | colwidth | group | notes | refs }}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Reflist/styles.css&amp;diff=76376</id>
		<title>Template:Reflist/styles.css</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Reflist/styles.css&amp;diff=76376"/>
		<updated>2026-07-24T10:50:32Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=yes}} */&lt;br /&gt;
/* columns-2 and columns-3 are legacy for &amp;quot;2 or more&amp;quot; column view from when the&lt;br /&gt;
 * template was implemented with column-count.&lt;br /&gt;
 */&lt;br /&gt;
.reflist-columns-2 {&lt;br /&gt;
	column-width: 30em;&lt;br /&gt;
}&lt;br /&gt;
.reflist-columns-3 {&lt;br /&gt;
	column-width: 25em;&lt;br /&gt;
}&lt;br /&gt;
/* Match Vector 2022 after [[gerrit:1185300]]. */&lt;br /&gt;
body.skin-vector-2022 .reflist-columns-2 {&lt;br /&gt;
	column-width: 27em;&lt;br /&gt;
}&lt;br /&gt;
body.skin-vector-2022 .reflist-columns-3 {&lt;br /&gt;
	column-width: 22.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* These should probably be moved to MediaWiki:Common.css to work with &amp;lt;references&amp;gt; as well. */&lt;br /&gt;
.references[data-mw-group=upper-alpha] {&lt;br /&gt;
	list-style-type: upper-alpha;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.references[data-mw-group=upper-roman] {&lt;br /&gt;
	list-style-type: upper-roman;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.references[data-mw-group=lower-alpha] {&lt;br /&gt;
	list-style-type: lower-alpha;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.references[data-mw-group=lower-greek] {&lt;br /&gt;
	list-style-type: lower-greek;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.references[data-mw-group=lower-roman] {&lt;br /&gt;
	list-style-type: lower-roman;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Liststyle param. */&lt;br /&gt;
div.reflist-liststyle-upper-alpha .references {&lt;br /&gt;
	list-style-type: upper-alpha;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.reflist-liststyle-upper-roman .references {&lt;br /&gt;
	list-style-type: upper-roman;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.reflist-liststyle-lower-alpha .references {&lt;br /&gt;
	list-style-type: lower-alpha;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.reflist-liststyle-lower-greek .references {&lt;br /&gt;
	list-style-type: lower-greek;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.reflist-liststyle-lower-roman .references {&lt;br /&gt;
	list-style-type: lower-roman;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:Reflist&amp;diff=76374</id>
		<title>Template:Reflist</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:Reflist&amp;diff=76374"/>
		<updated>2026-07-24T10:50:31Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Reflist/styles.css&amp;quot; /&amp;gt;&amp;lt;div class=&amp;quot;reflist &amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{1|}}}{{{colwidth|}}}|reflist-columns references-column-width}} &amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#switch:{{{liststyle|{{{group|}}}}}}|upper-alpha|upper-roman|lower-alpha|lower-greek|lower-roman=reflist-{{{liststyle|{{{group}}}}}}}} &amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{1|}}}|{{#iferror:{{#ifexpr: {{{1|1}}} &amp;gt; 1 }}||{{#switch:{{{1|}}}|1=|2=reflist-columns-2|#default=reflist-columns-3}} }}}}&amp;quot; &amp;lt;!-- end class&lt;br /&gt;
--&amp;gt;{{#if: {{{1|}}}&amp;lt;!-- start style --&amp;gt;&lt;br /&gt;
    | {{#iferror: {{#ifexpr: {{{1|1}}} &amp;gt; 1 }} |style=&amp;quot;column-width: {{{1}}};&amp;quot;}}&lt;br /&gt;
    | {{#if: {{{colwidth|}}}|style=&amp;quot;column-width: {{{colwidth}}};&amp;quot;}}&lt;br /&gt;
    }}&amp;gt;&lt;br /&gt;
{{#tag:references|{{{refs|}}}|group={{{group|}}}|responsive={{#if:{{{1|}}}{{{colwidth|}}}|0|1}}}}&amp;lt;/div&amp;gt;{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using reflist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Reflist]] with unknown parameter &amp;quot;_VALUE_&amp;quot;|ignoreblank=y| 1 | colwidth | group | liststyle | refs }}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:8TeamBracket-PagePlayoff/doc&amp;diff=76372</id>
		<title>Template:8TeamBracket-PagePlayoff/doc</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:8TeamBracket-PagePlayoff/doc&amp;diff=76372"/>
		<updated>2026-07-24T10:50:31Z</updated>

		<summary type="html">&lt;p&gt;Osarius: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation subpage}}&lt;br /&gt;
;Standard paths&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{BASEPAGENAME}}|}}&lt;br /&gt;
&lt;br /&gt;
;Crossing paths&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD1-RD2-cross = yes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{BASEPAGENAME}}|RD1-RD2-cross=yes}}&lt;br /&gt;
&lt;br /&gt;
{{#tag:syntaxhighlight|&lt;br /&gt;
{{((}}{{BASEPAGENAME}}&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| RD2-RD3-cross = yes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{))}}|lang=&amp;quot;wikitext&amp;quot;}}&lt;br /&gt;
{{{{BASEPAGENAME}}|RD2-RD3-cross=yes}}&lt;br /&gt;
&lt;br /&gt;
{{Module:Build bracket/doc|examples=|see also=&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;{{Sandbox other||&lt;br /&gt;
&amp;lt;!-- CATEGORIES HERE, THANKS --&amp;gt;&lt;br /&gt;
[[Category:8-Team bracket templates]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Novum-castrum&amp;diff=76150</id>
		<title>Template:UICA association Novum-castrum</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Novum-castrum&amp;diff=76150"/>
		<updated>2026-07-13T17:32:43Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Novum-castrum | trigram = NVC | association link = Curia Harpasti et Pediludii Imperii | flag = Flag of Novum-castrum.svg | club = {{{club|}}} | club logo-Castrum-sub-Calcis       = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Castrum-sub-Calcis|NVC}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Novum-castrum&lt;br /&gt;
| trigram = NVC&lt;br /&gt;
| association link = Curia Harpasti et Pediludii Imperii&lt;br /&gt;
| flag = Flag of Novum-castrum.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Castrum-sub-Calcis       = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Castrum-sub-Calcis|NVC}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Xiaolin&amp;diff=76149</id>
		<title>Template:UICA association Xiaolin</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Xiaolin&amp;diff=76149"/>
		<updated>2026-07-13T17:32:34Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Xiaolin | trigram = XIA | association link = Xiaolin Football Council | flag = Flag of Xiaolin.png | club = {{{club|}}} | club logo-Bhedstai Iron         = Unknown_club_logo.svg | club logo-Fouzhan Tigers        = Unknown_club_logo.svg | club logo-Hawkmont Supreme      = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Bhedstai Iron|XIA}} * {{UICAclublt|Fouzhan Tigers|XIA}}...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Xiaolin&lt;br /&gt;
| trigram = XIA&lt;br /&gt;
| association link = Xiaolin Football Council&lt;br /&gt;
| flag = Flag of Xiaolin.png&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Bhedstai Iron         = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Fouzhan Tigers        = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Hawkmont Supreme      = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Bhedstai Iron|XIA}}&lt;br /&gt;
* {{UICAclublt|Fouzhan Tigers|XIA}}&lt;br /&gt;
* {{UICAclublt|Hawkmont Supreme|XIA}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Tobar_Gainimh&amp;diff=76148</id>
		<title>Template:UICA association Tobar Gainimh</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Tobar_Gainimh&amp;diff=76148"/>
		<updated>2026-07-13T17:32:07Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Tobar Gainimh | trigram = TBG | association link = Ard-Chumann Caide den Ghaineamh | flag = Flag of Tobar Gainimh.svg | club = {{{club|}}} | club logo-Cnoc Mór Cromáin         = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Cnoc Mór Cromáin|TBG}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Tobar Gainimh&lt;br /&gt;
| trigram = TBG&lt;br /&gt;
| association link = Ard-Chumann Caide den Ghaineamh&lt;br /&gt;
| flag = Flag of Tobar Gainimh.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Cnoc Mór Cromáin         = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Cnoc Mór Cromáin|TBG}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_XIA&amp;diff=76147</id>
		<title>Template:UICA association XIA</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_XIA&amp;diff=76147"/>
		<updated>2026-07-13T17:31:43Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Xiaolin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Xiaolin]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_TBG&amp;diff=76146</id>
		<title>Template:UICA association TBG</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_TBG&amp;diff=76146"/>
		<updated>2026-07-13T17:31:29Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Tobar Gainimh&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Tobar Gainimh]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_NVC&amp;diff=76145</id>
		<title>Template:UICA association NVC</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_NVC&amp;diff=76145"/>
		<updated>2026-07-13T17:30:34Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Novum-castrum&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Novum-castrum]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Marmaladaica&amp;diff=76144</id>
		<title>Template:UICA association Marmaladaica</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Marmaladaica&amp;diff=76144"/>
		<updated>2026-07-13T17:29:39Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Marmaladaica | trigram = MRM | association link = Marmaladaican Soccer Friendship Council | flag = MarmaladaicaFlag.svg | club = {{{club|}}} | club logo-Cydonia Bears         = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|Cydonia Bears|MRM}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Marmaladaica&lt;br /&gt;
| trigram = MRM&lt;br /&gt;
| association link = Marmaladaican Soccer Friendship Council&lt;br /&gt;
| flag = MarmaladaicaFlag.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Cydonia Bears         = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Cydonia Bears|MRM}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_MRM&amp;diff=76143</id>
		<title>Template:UICA association MRM</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_MRM&amp;diff=76143"/>
		<updated>2026-07-13T17:28:23Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Marmaladaica&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Marmaladaica]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Kryosis&amp;diff=76141</id>
		<title>Template:UICA association Kryosis</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Kryosis&amp;diff=76141"/>
		<updated>2026-07-13T17:27:39Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Kryosis | trigram = KRS | association link = Revolutionary Imperial Soccer Enterprise | flag = Flag of Kryosis.png | club = {{{club|}}} | club logo-CF Alcázorro         = Unknown_club_logo.svg | club logo-Raiel Rockets        = Unknown_club_logo.svg | club logo-Revolo Rapids        = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|CF Alcázorro|KRS}} * {{UICAclublt|Raiel R...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Kryosis&lt;br /&gt;
| trigram = KRS&lt;br /&gt;
| association link = Revolutionary Imperial Soccer Enterprise&lt;br /&gt;
| flag = Flag of Kryosis.png&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-CF Alcázorro         = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Raiel Rockets        = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Revolo Rapids        = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|CF Alcázorro|KRS}}&lt;br /&gt;
* {{UICAclublt|Raiel Rockets|KRS}}&lt;br /&gt;
* {{UICAclublt|Revolo Rapids|KRS}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_KRS&amp;diff=76140</id>
		<title>Template:UICA association KRS</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_KRS&amp;diff=76140"/>
		<updated>2026-07-13T17:27:28Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Kryosis&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Kryosis]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Kage_no_Ryouiki&amp;diff=76139</id>
		<title>Template:UICA association Kage no Ryouiki</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Kage_no_Ryouiki&amp;diff=76139"/>
		<updated>2026-07-13T17:26:42Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Kage no Ryouiki | trigram = KNR | association link = Abyssal Council of Yokai Football | flag = Flag of Kage no Ryouiki.svg | club = {{{club|}}} | club logo-Yamiku Void           = Unknown_club_logo.svg | club logo-Malebolge Butchers    = Unknown_club_logo.svg | club logo-Chinoike Bloodhounds  = Unknown_club_logo.svg | club logo-Ganzir Ironclad       = Unknown_club_logo.svg | club logo-Naraka Frost G...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Kage no Ryouiki&lt;br /&gt;
| trigram = KNR&lt;br /&gt;
| association link = Abyssal Council of Yokai Football&lt;br /&gt;
| flag = Flag of Kage no Ryouiki.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-Yamiku Void           = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Malebolge Butchers    = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Chinoike Bloodhounds  = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Ganzir Ironclad       = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Naraka Frost Giants   = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Shura Blitz           = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Sanzu Wave            = Unknown_club_logo.svg&lt;br /&gt;
| club logo-Gashadokuro Breakers  = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|Yamiku Void|KNR}}&lt;br /&gt;
* {{UICAclublt|Malebolge Butchers|KNR}}&lt;br /&gt;
* {{UICAclublt|Chinoike Bloodhounds|KNR}}&lt;br /&gt;
* {{UICAclublt|Ganzir Ironclad|KNR}}&lt;br /&gt;
* {{UICAclublt|Naraka Frost Giants|KNR}}&lt;br /&gt;
* {{UICAclublt|Shura Blitz|KNR}}&lt;br /&gt;
* {{UICAclublt|Sanzu Wave|KNR}}&lt;br /&gt;
* {{UICAclublt|Gashadokuro Breakers|KNR}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_KNR&amp;diff=76138</id>
		<title>Template:UICA association KNR</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_KNR&amp;diff=76138"/>
		<updated>2026-07-13T17:26:22Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Redirected page to Template:UICA association Kage no Ryouiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:UICA association Kage no Ryouiki]]&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Erdingham&amp;diff=76137</id>
		<title>Template:UICA association Erdingham</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Erdingham&amp;diff=76137"/>
		<updated>2026-07-13T17:26:02Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Erdingham | trigram = ERD | association link = Erdingham National Football Board | flag = Flag of Erdingham.svg | club = {{{club|}}} | club logo-San Edmundo         = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|San Edmundo|ERD}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Erdingham&lt;br /&gt;
| trigram = ERD&lt;br /&gt;
| association link = Erdingham National Football Board&lt;br /&gt;
| flag = Flag of Erdingham.svg&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-San Edmundo         = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|San Edmundo|ERD}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
	<entry>
		<id>https://nssportwiki.com/index.php?title=Template:UICA_association_Eristicea&amp;diff=76136</id>
		<title>Template:UICA association Eristicea</title>
		<link rel="alternate" type="text/html" href="https://nssportwiki.com/index.php?title=Template:UICA_association_Eristicea&amp;diff=76136"/>
		<updated>2026-07-13T17:25:36Z</updated>

		<summary type="html">&lt;p&gt;Osarius: Created page with &amp;quot;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}} | association = Eristicea | trigram = ERS | association link = Eristicean Football Syndicate | flag = Flag of Eristicea.png | club = {{{club|}}} | club logo-AED Ajna        = Unknown_club_logo.svg | club logo-NP Ajna         = Unknown_club_logo.svg | club logo-PAOD Ajna       = Unknown_club_logo.svg }}&amp;lt;noinclude&amp;gt; List of included clubs: * {{UICAclublt|AED Ajna|ERS}} * {{UICAclublt|NP Ajna|ERS}} * {{UICAclublt|PAOD A...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{1&amp;lt;noinclude&amp;gt;|UICA show association&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
| association = Eristicea&lt;br /&gt;
| trigram = ERS&lt;br /&gt;
| association link = Eristicean Football Syndicate&lt;br /&gt;
| flag = Flag of Eristicea.png&lt;br /&gt;
| club = {{{club|}}}&lt;br /&gt;
| club logo-AED Ajna        = Unknown_club_logo.svg&lt;br /&gt;
| club logo-NP Ajna         = Unknown_club_logo.svg&lt;br /&gt;
| club logo-PAOD Ajna       = Unknown_club_logo.svg&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
List of included clubs:&lt;br /&gt;
* {{UICAclublt|AED Ajna|ERS}}&lt;br /&gt;
* {{UICAclublt|NP Ajna|ERS}}&lt;br /&gt;
* {{UICAclublt|PAOD Ajna|ERS}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osarius</name></author>
	</entry>
</feed>