<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Aetymology%2Ftemplates%2Fdescendant</id>
	<title>Module:etymology/templates/descendant - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Aetymology%2Ftemplates%2Fdescendant"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:etymology/templates/descendant&amp;action=history"/>
	<updated>2026-05-24T17:48:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:etymology/templates/descendant&amp;diff=424252&amp;oldid=prev</id>
		<title>Sware at 21:02, 11 January 2025</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:etymology/templates/descendant&amp;diff=424252&amp;oldid=prev"/>
		<updated>2025-01-11T21:02:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://linguifex.com/w/index.php?title=Module:etymology/templates/descendant&amp;amp;diff=424252&amp;amp;oldid=320516&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:etymology/templates/descendant&amp;diff=320516&amp;oldid=prev</id>
		<title>Sware at 14:12, 29 July 2023</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:etymology/templates/descendant&amp;diff=320516&amp;oldid=prev"/>
		<updated>2023-07-29T14:12:30Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:12, 29 July 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l72&quot;&gt;Line 72:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 72:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	if desc_tree then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	if desc_tree then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		params = {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		params = {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			[1] = {required = true, default = &quot;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;gem&lt;/del&gt;-pro&quot;},&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			[1] = {required = true, default = &quot;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;alo&lt;/ins&gt;-pro&quot;},&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			[2] = {required = true, list = true, allow_holes = true, default = &quot;*&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;fuhsaz&lt;/del&gt;&quot;},&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			[2] = {required = true, list = true, allow_holes = true, default = &quot;*&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tsxī&lt;/ins&gt;&quot;},&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			[&amp;quot;notext&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			[&amp;quot;notext&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			[&amp;quot;noalts&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			[&amp;quot;noalts&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l541&quot;&gt;Line 541:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 541:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		elseif #seen_terms == 1 then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		elseif #seen_terms == 1 then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			error(&amp;quot;No Descendants section was found in the entry [[&amp;quot; .. seen_terms[1] ..&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			error(&amp;quot;No Descendants section was found in the entry [[&amp;quot; .. seen_terms[1] ..&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				&quot;]] under the header for &quot; .. lang:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;getNonEtymologicalName&lt;/del&gt;() .. &quot;.&quot;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				&quot;]] under the header for &quot; .. lang:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;getCanonicalName&lt;/ins&gt;() .. &quot;.&quot;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		else&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		else&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			for i, term in ipairs(seen_terms) do&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			for i, term in ipairs(seen_terms) do&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l547&quot;&gt;Line 547:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 547:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			error(&amp;quot;No Descendants section was found in any of the entries &amp;quot; ..&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			error(&amp;quot;No Descendants section was found in any of the entries &amp;quot; ..&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.concat(seen_terms, &quot;, &quot;) .. &quot; under the header for &quot; .. lang:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;getNonEtymologicalName&lt;/del&gt;() .. &quot;.&quot;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.concat(seen_terms, &quot;, &quot;) .. &quot; under the header for &quot; .. lang:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;getCanonicalName&lt;/ins&gt;() .. &quot;.&quot;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:etymology/templates/descendant&amp;diff=320488&amp;oldid=prev</id>
		<title>Sware at 13:41, 29 July 2023</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:etymology/templates/descendant&amp;diff=320488&amp;oldid=prev"/>
		<updated>2023-07-29T13:41:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:41, 29 July 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l11&quot;&gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;local function track(page)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	return require(&quot;Module:debug/track&quot;)(&quot;descendant/&quot; .. page)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;end&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local function ine(arg)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local function ine(arg)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l188&quot;&gt;Line 188:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 182:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	lang = m_languages.getByCode(lang, 1, &amp;quot;allow etym&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	lang = m_languages.getByCode(lang, 1, &amp;quot;allow etym&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	if lang:getCode() ~= lang:getNonEtymologicalCode() then&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		-- [[Special:WhatLinksHere/Template:tracking/descendant/etymological]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		track(&quot;etymological&quot;)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		track(&quot;etymological/&quot; .. lang:getCode())&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	end&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local languageName = lang:getDisplayForm()&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local languageName = lang:getDisplayForm()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l397&quot;&gt;Line 397:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 385:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					link = require(&amp;quot;Module:links&amp;quot;).full_link(termobj, nil, true)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					link = require(&amp;quot;Module:links&amp;quot;).full_link(termobj, nil, true)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				elseif termobj.ts or termobj.gloss or #termobj.genders &amp;gt; 0 then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				elseif termobj.ts or termobj.gloss or #termobj.genders &amp;gt; 0 then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;					-- [[Special:WhatLinksHere/Template:tracking/descendant/no term]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;					track(&quot;no term&quot;)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					termobj.term = nil&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					termobj.term = nil&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					link = require(&amp;quot;Module:links&amp;quot;).full_link(termobj, nil, true)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					link = require(&amp;quot;Module:links&amp;quot;).full_link(termobj, nil, true)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l405&quot;&gt;Line 405:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 391:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						:gsub(&amp;quot;&amp;lt;small&amp;gt;%[Term%?%]&amp;lt;/small&amp;gt;&amp;amp;nbsp;&amp;quot;, &amp;quot;&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						:gsub(&amp;quot;&amp;lt;small&amp;gt;%[Term%?%]&amp;lt;/small&amp;gt;&amp;amp;nbsp;&amp;quot;, &amp;quot;&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						:gsub(&amp;quot;%[%[Category:[^%[%]]+ term requests%]%]&amp;quot;, &amp;quot;&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						:gsub(&amp;quot;%[%[Category:[^%[%]]+ term requests%]%]&amp;quot;, &amp;quot;&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;				else -- display no link at all&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;					-- [[Special:WhatLinksHere/Template:tracking/descendant/no term or annotations]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;					track(&quot;no term or annotations&quot;)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return link&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return link&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l535&quot;&gt;Line 535:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 518:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			if term and (desc_tree and not args[&amp;quot;noalts&amp;quot;] or not desc_tree and args[&amp;quot;alts&amp;quot;]) then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			if term and (desc_tree and not args[&amp;quot;noalts&amp;quot;] or not desc_tree and args[&amp;quot;alts&amp;quot;]) then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;				-- [[Special:WhatLinksHere/Template:tracking/descendant/alts]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;				track(&quot;alts&quot;)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				alts = m_desctree.getAlternativeForms(lang, sc, term, id)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				alts = m_desctree.getAlternativeForms(lang, sc, term, id)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			else&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			else&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:etymology/templates/descendant&amp;diff=320485&amp;oldid=prev</id>
		<title>Sware: Created page with &quot;local export = {}  local listToSet = require(&quot;Module:table/listToSet&quot;) local rsplit = mw.text.split  local error_on_no_descendants = false  local function qualifier(content) 	if content then 		return &#039;&lt;span class=&quot;ib-brac qualifier-brac&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ib-content qualifier-content&quot;&gt;&#039; .. content .. &#039;&lt;/span&gt;&lt;span class=&quot;ib-brac qualifier-brac&quot;&gt;)&lt;/span&gt;&#039; 	end end   local function track(page) 	return require(&quot;Module:debug/track&quot;)(&quot;descendant/&quot; .. page) end   local func...&quot;</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:etymology/templates/descendant&amp;diff=320485&amp;oldid=prev"/>
		<updated>2023-07-29T13:38:36Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local export = {}  local listToSet = require(&amp;quot;Module:table/listToSet&amp;quot;) local rsplit = mw.text.split  local error_on_no_descendants = false  local function qualifier(content) 	if content then 		return &amp;#039;&amp;lt;span class=&amp;quot;ib-brac qualifier-brac&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ib-content qualifier-content&amp;quot;&amp;gt;&amp;#039; .. content .. &amp;#039;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ib-brac qualifier-brac&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;#039; 	end end   local function track(page) 	return require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;descendant/&amp;quot; .. page) end   local func...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local listToSet = require(&amp;quot;Module:table/listToSet&amp;quot;)&lt;br /&gt;
local rsplit = mw.text.split&lt;br /&gt;
&lt;br /&gt;
local error_on_no_descendants = false&lt;br /&gt;
&lt;br /&gt;
local function qualifier(content)&lt;br /&gt;
	if content then&lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;ib-brac qualifier-brac&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ib-content qualifier-content&amp;quot;&amp;gt;&amp;#039; .. content .. &amp;#039;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ib-brac qualifier-brac&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function track(page)&lt;br /&gt;
	return require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;descendant/&amp;quot; .. page)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function ine(arg)&lt;br /&gt;
	if arg == &amp;quot;&amp;quot; then&lt;br /&gt;
		return nil&lt;br /&gt;
	else&lt;br /&gt;
		return arg&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function add_tooltip(text, tooltip)&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;desc-arr&amp;quot; title=&amp;quot;&amp;#039; .. tooltip .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local m_dialect_tags&lt;br /&gt;
local function memoize_require_dialect_tags()&lt;br /&gt;
	if not m_dialect_tags then&lt;br /&gt;
		m_dialect_tags = require(&amp;quot;Module:dialect tags&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return m_dialect_tags&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Replace comma+whitespace in the non-modifier parts of an alternating run (after parse_balanced_segment_run() is&lt;br /&gt;
-- called). See split_on_comma() in [[Module:dialect tags]].&lt;br /&gt;
local function escape_comma_whitespace_in_alternating_run(run)&lt;br /&gt;
	local need_tempcomma_undo = false&lt;br /&gt;
	for i, seg in ipairs(run) do&lt;br /&gt;
		if i % 2 == 1 then&lt;br /&gt;
			local this_need_tempcomma_undo&lt;br /&gt;
			if seg:find(&amp;quot;,&amp;quot;) then&lt;br /&gt;
				run[i], this_need_tempcomma_undo = memoize_require_dialect_tags().escape_comma_whitespace(seg)&lt;br /&gt;
			end&lt;br /&gt;
			need_tempcomma_undo = need_tempcomma_undo or this_need_tempcomma_undo&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return need_tempcomma_undo&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Params that modify a descendant term (as also supported by {{l}}, {{m}}). Doesn&amp;#039;t include gloss=, which we&lt;br /&gt;
-- handle specially.&lt;br /&gt;
local param_term_mods = {&amp;quot;alt&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;id&amp;quot;, &amp;quot;lit&amp;quot;, &amp;quot;pos&amp;quot;, &amp;quot;sc&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;tr&amp;quot;, &amp;quot;ts&amp;quot;}&lt;br /&gt;
local param_term_mod_set = listToSet(param_term_mods)&lt;br /&gt;
-- Boolean params indicating whether a descendant term (or all terms) are particular sorts of borrowings.&lt;br /&gt;
local bortypes = {&amp;quot;inh&amp;quot;, &amp;quot;bor&amp;quot;, &amp;quot;lbor&amp;quot;, &amp;quot;slb&amp;quot;, &amp;quot;obor&amp;quot;, &amp;quot;translit&amp;quot;, &amp;quot;der&amp;quot;, &amp;quot;clq&amp;quot;, &amp;quot;pclq&amp;quot;, &amp;quot;sml&amp;quot;, &amp;quot;unc&amp;quot;}&lt;br /&gt;
local bortype_set = listToSet(bortypes)&lt;br /&gt;
-- Aliases of clq=.&lt;br /&gt;
local calque_aliases = {&amp;quot;cal&amp;quot;, &amp;quot;calq&amp;quot;, &amp;quot;calque&amp;quot;}&lt;br /&gt;
local calque_alias_set = listToSet(calque_aliases)&lt;br /&gt;
-- Aliases of pclq=.&lt;br /&gt;
local partial_calque_aliases = {&amp;quot;pcal&amp;quot;, &amp;quot;pcalq&amp;quot;, &amp;quot;pcalque&amp;quot;}&lt;br /&gt;
local partial_calque_alias_set = listToSet(partial_calque_aliases)&lt;br /&gt;
-- Miscellaneous list params.&lt;br /&gt;
local misc_list_params = {&amp;quot;q&amp;quot;, &amp;quot;qq&amp;quot;, &amp;quot;tag&amp;quot;}&lt;br /&gt;
local misc_list_param_set = listToSet(misc_list_params)&lt;br /&gt;
&lt;br /&gt;
local function desc_or_desc_tree(frame, desc_tree)&lt;br /&gt;
	local params&lt;br /&gt;
	if desc_tree then&lt;br /&gt;
		params = {&lt;br /&gt;
			[1] = {required = true, default = &amp;quot;gem-pro&amp;quot;},&lt;br /&gt;
			[2] = {required = true, list = true, allow_holes = true, default = &amp;quot;*fuhsaz&amp;quot;},&lt;br /&gt;
			[&amp;quot;notext&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
			[&amp;quot;noalts&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
			[&amp;quot;noparent&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		params = {&lt;br /&gt;
			[1] = {required = true},&lt;br /&gt;
			[2] = {list = true, allow_holes = true},&lt;br /&gt;
			[&amp;quot;alts&amp;quot;] = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add a &amp;quot;regular&amp;quot; list param such as g=, gloss=, lit=, etc. &amp;quot;Regular&amp;quot; here means that `param` and `param1` are&lt;br /&gt;
	-- the same thing. `type` if given is the param type (e.g. &amp;quot;boolean&amp;quot;) and `alias_of` is used for params that are&lt;br /&gt;
	-- aliases of other params.&lt;br /&gt;
	local function add_regular_list_param(param, type, alias_of)&lt;br /&gt;
		params[param] = {type = type, alias_of = alias_of, list = true, allow_holes = true}&lt;br /&gt;
	end&lt;br /&gt;
	-- Add an index-separated list param such as bor=, calq=, qq=, etc. &amp;quot;Index-separated&amp;quot; means that `param` and&lt;br /&gt;
	-- `param1` are different. Non-numbered `param` is accessible as `args.param` while numbered `param1`, `param2`,&lt;br /&gt;
	-- etc. are accessible as `args.partparam[1]`, `args.partparam[2]`, etc. `type` if given is the param type (e.g.&lt;br /&gt;
	-- &amp;quot;boolean&amp;quot;) and `alias_of` is used for params that are aliases of other params.&lt;br /&gt;
	local function add_index_separated_list_param(param, type, alias_of)&lt;br /&gt;
		params[param] = {alias_of = alias_of, type = type}&lt;br /&gt;
		params[&amp;quot;part&amp;quot; .. param] = {alias_of = alias_of and &amp;quot;part&amp;quot; .. alias_of or nil, type = type,&lt;br /&gt;
			list = param, allow_holes = true, require_index = true}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, term_mod in ipairs(param_term_mods) do&lt;br /&gt;
		add_regular_list_param(term_mod)&lt;br /&gt;
	end&lt;br /&gt;
	-- Handle gloss= specially because it&amp;#039;s an alias.&lt;br /&gt;
	add_regular_list_param(&amp;quot;gloss&amp;quot;, nil, &amp;quot;t&amp;quot;)&lt;br /&gt;
	for _, bortype in ipairs(bortypes) do&lt;br /&gt;
		add_index_separated_list_param(bortype, &amp;quot;boolean&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	for _, calque_alias in ipairs(calque_aliases) do&lt;br /&gt;
		add_index_separated_list_param(calque_alias, &amp;quot;boolean&amp;quot;, &amp;quot;clq&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	for _, partial_calque_alias in ipairs(partial_calque_aliases) do&lt;br /&gt;
		add_index_separated_list_param(partial_calque_alias, &amp;quot;boolean&amp;quot;, &amp;quot;pclq&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	for _, misc_list_param in ipairs(misc_list_params) do&lt;br /&gt;
		add_index_separated_list_param(misc_list_param)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add other single params.&lt;br /&gt;
	for k, v in pairs({&lt;br /&gt;
		[&amp;quot;sclb&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
		[&amp;quot;nolb&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
		[&amp;quot;sandbox&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
	}) do&lt;br /&gt;
		params[k] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local namespace = mw.title.getCurrentTitle().nsText&lt;br /&gt;
&lt;br /&gt;
	local parent_args&lt;br /&gt;
	if frame.args[1] then&lt;br /&gt;
		parent_args = frame.args&lt;br /&gt;
	else&lt;br /&gt;
		parent_args = frame:getParent().args&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Error to catch most uses of old-style parameters.&lt;br /&gt;
	if ine(parent_args[4]) and not ine(parent_args[3]) and not ine(parent_args.tr2) and not ine(parent_args.ts2)&lt;br /&gt;
		and not ine(parent_args.t2) and not ine(parent_args.gloss2) and not ine(parent_args.g2)&lt;br /&gt;
		and not ine(parent_args.alt2) then&lt;br /&gt;
		error(&amp;quot;You specified a term in 4= and not one in 3=. You probably meant to use t= to specify a gloss instead. &amp;quot;&lt;br /&gt;
			.. &amp;quot;If you intended to specify two terms, put the second term in 3=.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not ine(parent_args[3]) and not ine(parent_args.alt2) and not ine(parent_args.tr2) and not ine(parent_args.ts2)&lt;br /&gt;
		and ine(parent_args.g2) then&lt;br /&gt;
		error(&amp;quot;You specified a gender in g2= but no term in 3=. You were probably trying to specify two genders for &amp;quot;&lt;br /&gt;
			.. &amp;quot;a single term. To do that, put both genders in g=, comma-separated.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(parent_args, params)&lt;br /&gt;
&lt;br /&gt;
	if args.sandbox then&lt;br /&gt;
		if namespace == &amp;quot;&amp;quot; or namespace == &amp;quot;Reconstruction&amp;quot; then&lt;br /&gt;
			error(&amp;quot;The sandbox module, Module:descendants tree/sandbox, should not be used in entries.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local lang = args[1]&lt;br /&gt;
	local terms = args[2]&lt;br /&gt;
	local alts = args[&amp;quot;alt&amp;quot;]&lt;br /&gt;
	&lt;br /&gt;
	local m_desctree&lt;br /&gt;
	if desc_tree or alts then&lt;br /&gt;
		if args.sandbox or require(&amp;quot;Module:yesno&amp;quot;)(frame.args.sandbox, false) then&lt;br /&gt;
			m_desctree = require(&amp;quot;Module:descendants tree/sandbox&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			m_desctree = require(&amp;quot;Module:descendants tree&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if mw.title.getCurrentTitle().nsText == &amp;quot;Template&amp;quot; then&lt;br /&gt;
		lang = lang or &amp;quot;en&amp;quot;&lt;br /&gt;
		if #terms == 0 then&lt;br /&gt;
			terms = {&amp;quot;word&amp;quot;}&lt;br /&gt;
			terms.maxindex = 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
	lang = m_languages.getByCode(lang, 1, &amp;quot;allow etym&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if lang:getCode() ~= lang:getNonEtymologicalCode() then&lt;br /&gt;
		-- [[Special:WhatLinksHere/Template:tracking/descendant/etymological]]&lt;br /&gt;
		track(&amp;quot;etymological&amp;quot;)&lt;br /&gt;
		track(&amp;quot;etymological/&amp;quot; .. lang:getCode())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local languageName = lang:getDisplayForm()&lt;br /&gt;
&lt;br /&gt;
	local label&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;quot;sclb&amp;quot;] then&lt;br /&gt;
		local sc = args[&amp;quot;sc&amp;quot;][1] and require(&amp;quot;Module:scripts&amp;quot;).getByCode(args[&amp;quot;sc&amp;quot;][1], &amp;quot;sc&amp;quot;)&lt;br /&gt;
		if sc then&lt;br /&gt;
			label = sc:getDisplayForm()&lt;br /&gt;
		else&lt;br /&gt;
			local term, alt = terms[1], alts[1]&lt;br /&gt;
			label = lang:findBestScript(term or alt):getDisplayForm()&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		label = languageName&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Find the maximum index among any of the list parameters.&lt;br /&gt;
	local maxmaxindex = terms.maxindex&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.maxindex and v.maxindex &amp;gt; maxmaxindex then&lt;br /&gt;
			maxmaxindex = v.maxindex&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Convert a raw tag= param (or nil) to a list of formatted dialect tags; unrecognized tags are passed through&lt;br /&gt;
	-- unchanged. Return nil if nil passed in.&lt;br /&gt;
	local function tags_to_dialects(tags)&lt;br /&gt;
		if not tags then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		local m_dialect_tags = memoize_require_dialect_tags()&lt;br /&gt;
		return m_dialect_tags.make_dialects(m_dialect_tags.split_on_comma(tags), lang)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Return a function of one argument `arg` (a param name), which fetches args[`arg`] if index == 0, else&lt;br /&gt;
	-- args[&amp;quot;part&amp;quot; .. `arg`][index].&lt;br /&gt;
	local function get_val(index)&lt;br /&gt;
		return function(arg)&lt;br /&gt;
			if index == 0 then&lt;br /&gt;
				return args[arg]&lt;br /&gt;
			else&lt;br /&gt;
				return args[&amp;quot;part&amp;quot; .. arg][index]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Return the arrow text for the `index`th term, or the overall arrow text if index == 0.&lt;br /&gt;
	local function get_arrow(index)&lt;br /&gt;
		local val = get_val(index)&lt;br /&gt;
		local arrow&lt;br /&gt;
&lt;br /&gt;
		if val(&amp;quot;bor&amp;quot;) then&lt;br /&gt;
			arrow = add_tooltip(&amp;quot;→&amp;quot;, &amp;quot;borrowed&amp;quot;)&lt;br /&gt;
		elseif val(&amp;quot;lbor&amp;quot;) then&lt;br /&gt;
			arrow = add_tooltip(&amp;quot;→&amp;quot;, &amp;quot;learned borrowing&amp;quot;)&lt;br /&gt;
		elseif val(&amp;quot;slb&amp;quot;) then&lt;br /&gt;
			arrow = add_tooltip(&amp;quot;→&amp;quot;, &amp;quot;semi-learned borrowing&amp;quot;)&lt;br /&gt;
		elseif val(&amp;quot;obor&amp;quot;) then&lt;br /&gt;
			arrow = add_tooltip(&amp;quot;→&amp;quot;, &amp;quot;orthographic borrowing&amp;quot;)&lt;br /&gt;
		elseif args[&amp;quot;translit&amp;quot;] then&lt;br /&gt;
			arrow = add_tooltip(&amp;quot;→&amp;quot;, &amp;quot;transliteration&amp;quot;)&lt;br /&gt;
		elseif val(&amp;quot;clq&amp;quot;) then&lt;br /&gt;
			arrow = add_tooltip(&amp;quot;→&amp;quot;, &amp;quot;calque&amp;quot;)&lt;br /&gt;
		elseif val(&amp;quot;pclq&amp;quot;) then&lt;br /&gt;
			arrow = add_tooltip(&amp;quot;→&amp;quot;, &amp;quot;partial calque&amp;quot;)&lt;br /&gt;
		elseif val(&amp;quot;sml&amp;quot;) then&lt;br /&gt;
			arrow = add_tooltip(&amp;quot;→&amp;quot;, &amp;quot;semantic loan&amp;quot;)&lt;br /&gt;
		elseif val(&amp;quot;inh&amp;quot;) or (val(&amp;quot;unc&amp;quot;) and not val(&amp;quot;der&amp;quot;)) then&lt;br /&gt;
			arrow = add_tooltip(&amp;quot;&amp;gt;&amp;quot;, &amp;quot;inherited&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			arrow = &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		-- allow der=1 in conjunction with bor=1 to indicate e.g. English &amp;quot;pars recta&amp;quot;&lt;br /&gt;
		-- derived and borrowed from Latin &amp;quot;pars&amp;quot;.&lt;br /&gt;
		if val(&amp;quot;der&amp;quot;) then&lt;br /&gt;
			arrow = arrow .. add_tooltip(&amp;quot;⇒&amp;quot;, &amp;quot;reshaped by analogy or addition of morphemes&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if val(&amp;quot;unc&amp;quot;) then&lt;br /&gt;
			arrow = arrow .. add_tooltip(&amp;quot;?&amp;quot;, &amp;quot;uncertain&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if arrow ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			arrow = arrow .. &amp;quot; &amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return arrow&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Return the pre-qualifier text for the `index`th term, or the overall pre-qualifier text if index == 0.&lt;br /&gt;
	local function get_pre_qualifiers(index)&lt;br /&gt;
		local val = get_val(index)&lt;br /&gt;
		local quals&lt;br /&gt;
&lt;br /&gt;
		if index &amp;gt; 0 then&lt;br /&gt;
			quals = tags_to_dialects(val(&amp;quot;tag&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if val(&amp;quot;q&amp;quot;) then&lt;br /&gt;
			quals = quals or {}&lt;br /&gt;
			table.insert(quals, val(&amp;quot;q&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if quals then&lt;br /&gt;
			return require(&amp;quot;Module:qualifier&amp;quot;).format_qualifier(quals) .. &amp;quot; &amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Return the post-qualifier text for the `index`th term, or the overall post-qualifier text if index == 0.&lt;br /&gt;
	local function get_post_qualifiers(index)&lt;br /&gt;
		local val = get_val(index)&lt;br /&gt;
		local postqs = {}&lt;br /&gt;
&lt;br /&gt;
		if val(&amp;quot;inh&amp;quot;) then&lt;br /&gt;
			table.insert(postqs, qualifier(&amp;quot;inherited&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if val(&amp;quot;lbor&amp;quot;) then&lt;br /&gt;
			table.insert(postqs, qualifier(&amp;quot;learned&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if val(&amp;quot;slb&amp;quot;) then&lt;br /&gt;
			table.insert(postqs, qualifier(&amp;quot;semi-learned&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if val(&amp;quot;translit&amp;quot;) then&lt;br /&gt;
			table.insert(postqs, qualifier(&amp;quot;transliteration&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if val(&amp;quot;clq&amp;quot;) then&lt;br /&gt;
			table.insert(postqs, qualifier(&amp;quot;calque&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if val(&amp;quot;pclq&amp;quot;) then&lt;br /&gt;
			table.insert(postqs, qualifier(&amp;quot;partial calque&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if val(&amp;quot;sml&amp;quot;) then&lt;br /&gt;
			table.insert(postqs, qualifier(&amp;quot;semantic loan&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if val(&amp;quot;qq&amp;quot;) then&lt;br /&gt;
			table.insert(postqs, require(&amp;quot;Module:qualifier&amp;quot;).format_qualifier(val(&amp;quot;qq&amp;quot;)))&lt;br /&gt;
		end&lt;br /&gt;
		if index == 0 then&lt;br /&gt;
			local dialects = tags_to_dialects(val(&amp;quot;tag&amp;quot;))&lt;br /&gt;
			if dialects then&lt;br /&gt;
				table.insert(postqs, memoize_require_dialect_tags().post_format_dialects(dialects))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if #postqs &amp;gt; 0 then&lt;br /&gt;
			return &amp;quot; &amp;quot; .. table.concat(postqs, &amp;quot; &amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	local descendants = {}&lt;br /&gt;
	local saw_descendants = false&lt;br /&gt;
	local seen_terms = {}&lt;br /&gt;
	local put&lt;br /&gt;
	local use_semicolon = false&lt;br /&gt;
&lt;br /&gt;
	local ind = 0&lt;br /&gt;
	for i = 1, maxmaxindex do&lt;br /&gt;
		local term = terms[i]&lt;br /&gt;
		if term ~= &amp;quot;;&amp;quot; then&lt;br /&gt;
			ind = ind + 1&lt;br /&gt;
			local alt = args[&amp;quot;alt&amp;quot;][ind]&lt;br /&gt;
			local id = args[&amp;quot;id&amp;quot;][ind]&lt;br /&gt;
			local sc = args[&amp;quot;sc&amp;quot;][ind] and require(&amp;quot;Module:scripts&amp;quot;).getByCode(args[&amp;quot;sc&amp;quot;][ind], &amp;quot;sc&amp;quot; .. (ind == 1 and &amp;quot;&amp;quot; or ind)) or nil&lt;br /&gt;
			local tr = args[&amp;quot;tr&amp;quot;][ind]&lt;br /&gt;
			local ts = args[&amp;quot;ts&amp;quot;][ind]&lt;br /&gt;
			local gloss = args[&amp;quot;t&amp;quot;][ind]&lt;br /&gt;
			local pos = args[&amp;quot;pos&amp;quot;][ind]&lt;br /&gt;
			local lit = args[&amp;quot;lit&amp;quot;][ind]&lt;br /&gt;
			local g = args[&amp;quot;g&amp;quot;][ind] and rsplit(args[&amp;quot;g&amp;quot;][ind], &amp;quot;%s*,%s*&amp;quot;) or {}&lt;br /&gt;
			local link&lt;br /&gt;
&lt;br /&gt;
			local termobj =	{&lt;br /&gt;
				lang = lang,&lt;br /&gt;
			}&lt;br /&gt;
			-- Initialize `termobj` with indexed modifier params such as t1, t2, etc. and alt1, alt2, etc. Inline&lt;br /&gt;
			-- modifiers specified using the &amp;lt;...&amp;gt; notation override these.&lt;br /&gt;
			local function reinit_termobj(term)&lt;br /&gt;
				termobj.term = term&lt;br /&gt;
				termobj.sc = sc&lt;br /&gt;
				termobj.term = term&lt;br /&gt;
				termobj.alt = alt&lt;br /&gt;
				termobj.id = id&lt;br /&gt;
				termobj.tr = tr&lt;br /&gt;
				termobj.ts = ts&lt;br /&gt;
				termobj.genders = g&lt;br /&gt;
				termobj.gloss = gloss&lt;br /&gt;
				termobj.pos = pos&lt;br /&gt;
				termobj.lit = lit&lt;br /&gt;
			end&lt;br /&gt;
			-- Construct a link out of `termobj`.&lt;br /&gt;
			local function get_link()&lt;br /&gt;
				local link = &amp;quot;&amp;quot;&lt;br /&gt;
				-- If an individual term has a literal comma in it, use semicolons for all joiners. Otherwise we use&lt;br /&gt;
				-- semicolon only if the user specified a literal semicolon as a term.&lt;br /&gt;
				if termobj.term and termobj.term:find(&amp;quot;,&amp;quot;) then&lt;br /&gt;
					use_semicolon = true&lt;br /&gt;
				end&lt;br /&gt;
				if termobj.term ~= &amp;quot;-&amp;quot; then -- including term == nil&lt;br /&gt;
					link = require(&amp;quot;Module:links&amp;quot;).full_link(termobj, nil, true)&lt;br /&gt;
				elseif termobj.ts or termobj.gloss or #termobj.genders &amp;gt; 0 then&lt;br /&gt;
					-- [[Special:WhatLinksHere/Template:tracking/descendant/no term]]&lt;br /&gt;
					track(&amp;quot;no term&amp;quot;)&lt;br /&gt;
					termobj.term = nil&lt;br /&gt;
					link = require(&amp;quot;Module:links&amp;quot;).full_link(termobj, nil, true)&lt;br /&gt;
					link = link&lt;br /&gt;
						:gsub(&amp;quot;&amp;lt;small&amp;gt;%[Term%?%]&amp;lt;/small&amp;gt; &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;&amp;lt;small&amp;gt;%[Term%?%]&amp;lt;/small&amp;gt;&amp;amp;nbsp;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;%[%[Category:[^%[%]]+ term requests%]%]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
				else -- display no link at all&lt;br /&gt;
					-- [[Special:WhatLinksHere/Template:tracking/descendant/no term or annotations]]&lt;br /&gt;
					track(&amp;quot;no term or annotations&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				return link&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- Check for new-style argument, e.g. מרים&amp;lt;tr:Miryem&amp;gt;. But exclude HTML entry with &amp;lt;span ...&amp;gt;, &amp;lt;i ...&amp;gt;,&lt;br /&gt;
			-- &amp;lt;br/&amp;gt; or similar in it, caused by wrapping an argument in {{l|...}}, {{af|...}} or similar. Basically,&lt;br /&gt;
			-- all tags of the sort we parse here should consist of less-than + letters + greater-than, e.g. &amp;lt;bor&amp;gt;, or&lt;br /&gt;
			-- less-than + letters + colon + arbitrary text with balanced angle brackets + greater-than, e.g. &amp;lt;tr:...&amp;gt;,&lt;br /&gt;
			-- so if we see a tag on the outer level that isn&amp;#039;t in this format, we don&amp;#039;t try to parse it. The&lt;br /&gt;
			-- restriction to the outer level is to allow generated HTML inside of e.g. qualifier tags, such as&lt;br /&gt;
			-- foo&amp;lt;q:similar to {{m|fr|bar}}&amp;gt;.&lt;br /&gt;
			if term and term:find(&amp;quot;&amp;lt;&amp;quot;) and not term:find(&amp;quot;&amp;lt;[a-z]*[^a-z:&amp;gt;]&amp;quot;) then&lt;br /&gt;
				if not put then&lt;br /&gt;
					put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				local run = put.parse_balanced_segment_run(term, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
				-- Split the non-modifier parts of an alternating run on comma, but not on comma+whitespace.&lt;br /&gt;
				local need_tempcomma_undo = escape_comma_whitespace_in_alternating_run(run)&lt;br /&gt;
				local comma_separated_runs&lt;br /&gt;
				if need_tempcomma_undo then&lt;br /&gt;
					comma_separated_runs =&lt;br /&gt;
						put.split_alternating_runs_and_frob_raw_text(run, &amp;quot;,&amp;quot;,&lt;br /&gt;
							memoize_require_dialect_tags().unescape_comma_whitespace)&lt;br /&gt;
				else&lt;br /&gt;
					comma_separated_runs = put.split_alternating_runs(run, &amp;quot;,&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				local sub_links = {}&lt;br /&gt;
&lt;br /&gt;
				local function parse_err(msg)&lt;br /&gt;
					local parts = {}&lt;br /&gt;
					for _, run in ipairs(comma_separated_runs) do&lt;br /&gt;
						table.insert(parts, table.concat(run))&lt;br /&gt;
					end&lt;br /&gt;
					error(msg .. &amp;quot;: &amp;quot; .. (i + 1) .. &amp;quot;=&amp;quot; .. table.concat(parts, &amp;quot;,&amp;quot;))&lt;br /&gt;
				end&lt;br /&gt;
				for j, run in ipairs(comma_separated_runs) do&lt;br /&gt;
					reinit_termobj(run[1])&lt;br /&gt;
					local seen_mods = {}&lt;br /&gt;
					for k = 2, #run - 1, 2 do&lt;br /&gt;
						if run[k + 1] ~= &amp;quot;&amp;quot; then&lt;br /&gt;
							parse_err(&amp;quot;Extraneous text &amp;#039;&amp;quot; .. run[k + 1] .. &amp;quot;&amp;#039; after modifier&amp;quot;)&lt;br /&gt;
						end&lt;br /&gt;
						local modtext = run[k]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
						if not modtext then&lt;br /&gt;
							parse_err(&amp;quot;Internal error: Modifier &amp;#039;&amp;quot; .. modtext .. &amp;quot;&amp;#039; isn&amp;#039;t surrounded by angle brackets&amp;quot;)&lt;br /&gt;
						end&lt;br /&gt;
						local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
						if prefix then&lt;br /&gt;
							if seen_mods[prefix] then&lt;br /&gt;
								parse_err(&amp;quot;Modifier &amp;#039;&amp;quot; .. prefix .. &amp;quot;&amp;#039; occurs twice, second occurrence &amp;quot; .. run[k])&lt;br /&gt;
							end&lt;br /&gt;
							seen_mods[prefix] = true&lt;br /&gt;
							if prefix == &amp;quot;t&amp;quot; or prefix == &amp;quot;gloss&amp;quot; then&lt;br /&gt;
								termobj.gloss = arg&lt;br /&gt;
							elseif prefix == &amp;quot;g&amp;quot; then&lt;br /&gt;
								termobj.genders = rsplit(arg, &amp;quot;%s*,%s*&amp;quot;)&lt;br /&gt;
							elseif prefix == &amp;quot;sc&amp;quot; then&lt;br /&gt;
								termobj.sc = require(&amp;quot;Module:scripts&amp;quot;).getByCode(arg, &amp;quot;&amp;quot; .. (i + 1) .. &amp;quot;:sc&amp;quot;)&lt;br /&gt;
							elseif param_term_mod_set[prefix] then&lt;br /&gt;
								termobj[prefix] = arg&lt;br /&gt;
							elseif misc_list_param_set[prefix] then&lt;br /&gt;
								if j &amp;lt; #comma_separated_runs then&lt;br /&gt;
									parse_err(&amp;quot;Modifier &amp;quot; .. run[k] .. &amp;quot; should come after the last term&amp;quot;)&lt;br /&gt;
								end&lt;br /&gt;
								args[&amp;quot;part&amp;quot; .. prefix][ind] = arg&lt;br /&gt;
							else&lt;br /&gt;
								parse_err(&amp;quot;Unrecognized prefix &amp;#039;&amp;quot; .. prefix .. &amp;quot;&amp;#039; in modifier &amp;quot; .. run[k])&lt;br /&gt;
							end&lt;br /&gt;
						elseif j &amp;lt; #comma_separated_runs then&lt;br /&gt;
							parse_err(&amp;quot;Modifier &amp;quot; .. run[k] .. &amp;quot; should come after the last term&amp;quot;)&lt;br /&gt;
						else&lt;br /&gt;
							if seen_mods[modtext] then&lt;br /&gt;
								parse_err(&amp;quot;Modifier &amp;#039;&amp;quot; .. modtext .. &amp;quot;&amp;#039; occurs twice&amp;quot;)&lt;br /&gt;
							end&lt;br /&gt;
							seen_mods[modtext] = true&lt;br /&gt;
							if bortype_set[modtext] then&lt;br /&gt;
								args[&amp;quot;part&amp;quot; .. modtext][ind] = true&lt;br /&gt;
							elseif calque_alias_set[modtext] then&lt;br /&gt;
								args.partclq[ind] = true&lt;br /&gt;
							elseif partial_calque_alias_set[modtext] then&lt;br /&gt;
								args.partpclq[ind] = true&lt;br /&gt;
							else&lt;br /&gt;
								parse_err(&amp;quot;Unrecognized modifier &amp;#039;&amp;quot; .. modtext .. &amp;quot;&amp;#039;&amp;quot;)&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					local sub_link = get_link()&lt;br /&gt;
					if sub_link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(sub_links, sub_link)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				link = table.concat(sub_links, &amp;quot;/&amp;quot;)&lt;br /&gt;
			elseif term and term:find(&amp;quot;,&amp;quot;) then&lt;br /&gt;
				local sub_terms = memoize_require_dialect_tags().split_on_comma(term)&lt;br /&gt;
				local sub_links = {}&lt;br /&gt;
				for _, sub_term in ipairs(sub_terms) do&lt;br /&gt;
					reinit_termobj(sub_term)&lt;br /&gt;
					local sub_link = get_link()&lt;br /&gt;
					if sub_link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(sub_links, sub_link)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				link = table.concat(sub_links, &amp;quot;/&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				reinit_termobj(term)&lt;br /&gt;
				link = get_link()&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local arrow = get_arrow(ind)&lt;br /&gt;
			local preqs = get_pre_qualifiers(ind)&lt;br /&gt;
			local postqs = get_post_qualifiers(ind)&lt;br /&gt;
			local alts&lt;br /&gt;
&lt;br /&gt;
			if desc_tree and term and term ~= &amp;quot;-&amp;quot; then&lt;br /&gt;
				table.insert(seen_terms, term)&lt;br /&gt;
				-- This is what I ([[User:Benwing2]]) had in Nov 2020 when I first implemented this.&lt;br /&gt;
				-- Since then, [[User:Fytcha]] added `true` as the fourth param.&lt;br /&gt;
				-- descendants[ind] = m_desctree.getDescendants(entryLang, term, id, maxmaxindex &amp;gt; 1)&lt;br /&gt;
				descendants[ind] = m_desctree.getDescendants(lang, sc, term, id, true)&lt;br /&gt;
				if descendants[ind] then&lt;br /&gt;
					saw_descendants = true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			descendants[ind] = descendants[ind] or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
			if term and (desc_tree and not args[&amp;quot;noalts&amp;quot;] or not desc_tree and args[&amp;quot;alts&amp;quot;]) then&lt;br /&gt;
				-- [[Special:WhatLinksHere/Template:tracking/descendant/alts]]&lt;br /&gt;
				track(&amp;quot;alts&amp;quot;)&lt;br /&gt;
				alts = m_desctree.getAlternativeForms(lang, sc, term, id)&lt;br /&gt;
			else&lt;br /&gt;
				alts = &amp;quot;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local linktext = table.concat{preqs, link, alts, postqs}&lt;br /&gt;
			if not args[&amp;quot;notext&amp;quot;] then&lt;br /&gt;
				linktext = arrow .. linktext&lt;br /&gt;
			end&lt;br /&gt;
			if linktext ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				if i &amp;gt; 1 then&lt;br /&gt;
					table.insert(parts, terms[i - 1] == &amp;quot;;&amp;quot; and &amp;quot;; &amp;quot; or &amp;quot;, &amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(parts, linktext)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if error_on_no_descendants and desc_tree and not saw_descendants then&lt;br /&gt;
		if #seen_terms == 0 then&lt;br /&gt;
			error(&amp;quot;[[Template:desctree]] invoked but no terms to retrieve descendants from&amp;quot;)&lt;br /&gt;
		elseif #seen_terms == 1 then&lt;br /&gt;
			error(&amp;quot;No Descendants section was found in the entry [[&amp;quot; .. seen_terms[1] ..&lt;br /&gt;
				&amp;quot;]] under the header for &amp;quot; .. lang:getNonEtymologicalName() .. &amp;quot;.&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			for i, term in ipairs(seen_terms) do&lt;br /&gt;
				seen_terms[i] = &amp;quot;[[&amp;quot; .. term .. &amp;quot;]]&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			error(&amp;quot;No Descendants section was found in any of the entries &amp;quot; ..&lt;br /&gt;
				table.concat(seen_terms, &amp;quot;, &amp;quot;) .. &amp;quot; under the header for &amp;quot; .. lang:getNonEtymologicalName() .. &amp;quot;.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	descendants = table.concat(descendants)&lt;br /&gt;
	if args[&amp;quot;noparent&amp;quot;] then&lt;br /&gt;
		return descendants&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local initial_arrow = get_arrow(0)&lt;br /&gt;
	local initial_preqs = get_pre_qualifiers(0)&lt;br /&gt;
	local final_postqs = get_post_qualifiers(0)&lt;br /&gt;
&lt;br /&gt;
	if use_semicolon then&lt;br /&gt;
		for i = 2, #parts - 1, 2 do&lt;br /&gt;
			parts[i] = &amp;quot;;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local all_linktext = initial_preqs .. table.concat(parts) .. final_postqs .. descendants&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;quot;notext&amp;quot;] then&lt;br /&gt;
		return all_linktext&lt;br /&gt;
	elseif args[&amp;quot;nolb&amp;quot;] then&lt;br /&gt;
		return initial_arrow .. all_linktext&lt;br /&gt;
	else&lt;br /&gt;
		return table.concat{initial_arrow, label, &amp;quot;:&amp;quot;, all_linktext ~= &amp;quot;&amp;quot; and &amp;quot; &amp;quot; or &amp;quot;&amp;quot;, all_linktext}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.descendant(frame)&lt;br /&gt;
	return desc_or_desc_tree(frame, false) .. require(&amp;quot;Module:TemplateStyles&amp;quot;)(&amp;quot;Module:etymology/style.css&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.descendants_tree(frame)&lt;br /&gt;
	return desc_or_desc_tree(frame, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>