<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ACanada_NTS</id>
	<title>Module:Canada NTS - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ACanada_NTS"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Canada_NTS&amp;action=history"/>
	<updated>2026-05-06T22:39:00Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Canada_NTS&amp;diff=135463&amp;oldid=prev</id>
		<title>imported&gt;WOSlinker: use require(&#039;strict&#039;) instead of require(&#039;Module:No globals&#039;)</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Canada_NTS&amp;diff=135463&amp;oldid=prev"/>
		<updated>2022-10-21T21:20:54Z</updated>

		<summary type="html">&lt;p&gt;use require(&amp;#039;strict&amp;#039;) instead of require(&amp;#039;Module:No globals&amp;#039;)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;);																-- alarm when global variables etc are used&lt;br /&gt;
&lt;br /&gt;
local get_args = require (&amp;#039;Module:Arguments&amp;#039;).getArgs;							-- simplfy frame and parent frame argument fetching&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; W I K I D A T A _ L A T _ L O N G _ G E T &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns latitude and longitude from wikidata for current page; nil else&lt;br /&gt;
&lt;br /&gt;
Nanaimo BC is Q16461 → latitude: 49.164166666667; longitude: -123.93638888889&lt;br /&gt;
&lt;br /&gt;
TODO: accept a &amp;lt;qid&amp;gt; argument? if called with &amp;lt;qid&amp;gt; fetch lat/lon for that qid and not for current page&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function wikidata_lat_lon_get()&lt;br /&gt;
	local qid = mw.wikibase.getEntityIdForCurrentPage();						-- get the qid for the current page&lt;br /&gt;
	if qid then&lt;br /&gt;
		local value_t = mw.wikibase.getBestStatements (qid, &amp;#039;P625&amp;#039;)[1];			-- attempt to get P625; nil when article does not have P625&lt;br /&gt;
		if value_t then&lt;br /&gt;
			value_t = value_t.mainsnak.datavalue.value;							--point to the value table&lt;br /&gt;
			return value_t.latitude, value_t.longitude;							-- return coordinates from value_t&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A R T I C L E _ N A M E _ F R O M _ Q I D _ G E T &amp;gt;----------------------------&lt;br /&gt;
&lt;br /&gt;
returns local article name for this wiki using &amp;lt;qid&amp;gt;; nil else&lt;br /&gt;
&lt;br /&gt;
TODO: if no local article fallback to en.wiki&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function article_name_from_qid_get (qid)&lt;br /&gt;
	local this_wiki_code = mw.language.getContentLanguage():getCode();			-- get this wiki&amp;#039;s language code&lt;br /&gt;
	if &amp;#039;wikidata&amp;#039; == mw.site.server then&lt;br /&gt;
		this_wiki_code = mw.getCurrentFrame():preprocess(&amp;#039;{{int:lang}}&amp;#039;);		-- on Wikidata so use interface language setting instead&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local wd_article = mw.wikibase.getSitelink (qid, this_wiki_code .. &amp;#039;wiki&amp;#039;);	-- fetch article title from WD; nil when no title available at this wiki&lt;br /&gt;
&lt;br /&gt;
	if wd_article then&lt;br /&gt;
		wd_article = table.concat ({&amp;#039;:&amp;#039;, this_wiki_code, &amp;#039;:&amp;#039;, wd_article});		-- interwiki-style link without brackets if taken from WD; leading colon required&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return wd_article;															-- article title from WD; nil else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; _ N A M E &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
This function takes in a National Tiling System ID and outputs the name of the National Topographic System map&lt;br /&gt;
sheet with that ID.  If no map sheet has been published under that ID, the output will be blank.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function _name (args_t)&lt;br /&gt;
	local data_t = mw.loadData (&amp;#039;Module:Canada NTS/data&amp;#039;);						-- load the ~/data module&lt;br /&gt;
	&lt;br /&gt;
	if not data_t[args_t[1]] then												-- nil when NTS ID not listed in ~/data&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	elseif &amp;#039;&amp;#039; == data_t[args_t[1]] then											-- when sheet has no title&lt;br /&gt;
		return &amp;#039;(untitled)&amp;#039;;													-- return a place-holder; lowercase here because capitalized implies that &amp;#039;Untitled&amp;#039; is the &amp;#039;title&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local title_parts_t = mw.text.split (data_t[args_t[1]], &amp;#039;|&amp;#039;);				-- title_parts[1] is link part of a wikilink; title_parts[2] is wikilink label (map name) or nil&lt;br /&gt;
	if mw.title.getCurrentTitle().text == title_parts_t[1] then					-- don&amp;#039;t create wikilink to the current article&lt;br /&gt;
		return title_parts_t[2] or title_parts_t[1];							-- return plaintext wikilink label or plain text article title (wikilink)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return string.format (&amp;#039;[[%s]]&amp;#039;, data_t[args_t[1]]);							-- return wikilinked map title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; N A M E &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
external invoke interface&lt;br /&gt;
&lt;br /&gt;
This function takes in a National Tiling System ID and outputs the name of the National Topographic System map sheet with that ID.&lt;br /&gt;
If no map sheet has been published under that ID, the output will be blank.&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Canada NTS|name|&amp;lt;NTS map sheet ID&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function name (frame)&lt;br /&gt;
	local args_t = get_args (frame);&lt;br /&gt;
	if not args_t[1] then&lt;br /&gt;
		return &amp;#039;&amp;lt;span style=&amp;quot;color:#d33&amp;quot;&amp;gt;National Tiling System ID required&amp;lt;/span&amp;gt;&amp;#039;;	-- TODO: better, more informative error handling&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return _name (args_t);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C O O R D _ L I M I T S _ T &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
a sequence of sequences.  Each sequence in &amp;lt;coord_limits_t&amp;gt; has two coordinate sequences that defines a rectangle&lt;br /&gt;
identified by the northwest and southeast corners of a subsection in the NTS series map.  The first coordinate sequence identifies the northwest&lt;br /&gt;
corner of the subsection; the second sequence identifies the southwest corner of the subsection.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local coord_limits_t = {&lt;br /&gt;
	{{44, 88}, {40, 56}},														-- series: 40, 30, 20, 10&lt;br /&gt;
	{{48, 88}, {44, 48}},														-- series: 41, 31, 21, 11, 1&lt;br /&gt;
	{{56, 136}, {48, 48}},														-- series: 102, 92, ..., 2; 103, 93, ..., 3&lt;br /&gt;
	{{68, 144}, {56, 56}},														-- series: 114, 104, ..., 14; 115, 105, ..., 15; 116, 106, ..., 16&lt;br /&gt;
	{{72, 144}, {68, 64}},														-- series: 117, 107, ..., 27&lt;br /&gt;
	{{76, 128}, {72, 72}},														-- series: 98, 88, ..., 38&lt;br /&gt;
	{{80, 128}, {76, 64}},														-- series: 99, 89, ..., 29&lt;br /&gt;
	{{84, 104}, {80, 56}},														-- series: 560, 340, 120&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L A T _ L O N _ V A L I D A T E &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
validates &amp;lt;lat&amp;gt; and &amp;lt;lon&amp;gt; to be inside one of the rectangles defined in &amp;lt;coord_limits_t&amp;gt;&lt;br /&gt;
&lt;br /&gt;
returns true when in bounds; false else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function lat_lon_validate (lat, lon)&lt;br /&gt;
	for _, coord_limit_t in ipairs (coord_limits_t) do							-- loop through the rectangle sequences in &amp;lt;coord_limits_t&amp;gt;&lt;br /&gt;
		local lat_N = coord_limit_t[1][1];										-- for readability ...&lt;br /&gt;
		local lat_S = coord_limit_t[2][1];&lt;br /&gt;
		local lon_W = coord_limit_t[1][2];&lt;br /&gt;
		local lon_E = coord_limit_t[2][2];&lt;br /&gt;
&lt;br /&gt;
		if (lat &amp;gt;= lat_S) and (lat &amp;lt; lat_N) and (lon &amp;gt;= lon_E) and (lon &amp;lt; lon_W) then&lt;br /&gt;
			return true;														-- &amp;lt;lat&amp;gt; and &amp;lt;lon&amp;gt; locate a point within bounds so done&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return false;																-- &amp;lt;lat&amp;gt; and &amp;lt;lon&amp;gt; locate a point out of bounds so done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X T E N T S &amp;gt;----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Calculates bounding boxes for 1:50,000 and 1:250,000 scale map sheets/areas from latitude and longitude&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function extents (lat, lon)&lt;br /&gt;
	local belt = math.floor((lat - 40) * 4);&lt;br /&gt;
	local strip = math.floor((lon - 48) * 2);&lt;br /&gt;
&lt;br /&gt;
	local s, n, e, w															-- 1:50,000 scale bounding box&lt;br /&gt;
	local a_s, a_n, a_e, a_w													-- 1:250,000 scale bounding box&lt;br /&gt;
&lt;br /&gt;
	local lat_limits = -- Latitude limits of bounding box&lt;br /&gt;
		{ s = belt / 4 + 40,&lt;br /&gt;
		n = belt / 4 + 40.25,&lt;br /&gt;
		a_s = math.floor(lat),&lt;br /&gt;
		a_n = math.floor(lat + 1)&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	local lon_limits = {e, w, a_e, a_w}&lt;br /&gt;
																				-- Calculation of longitude limits is different depending on zone&lt;br /&gt;
	if lat &amp;gt;= 40 and lat &amp;lt; 68 then												-- Southern zone&lt;br /&gt;
		lon_limits[&amp;quot;e&amp;quot;] = strip / 2 + 48;&lt;br /&gt;
		lon_limits[&amp;quot;w&amp;quot;] = strip / 2 + 48.5;&lt;br /&gt;
		lon_limits[&amp;quot;a_e&amp;quot;] = math.floor(strip / 4) * 2 + 48;&lt;br /&gt;
		lon_limits[&amp;quot;a_w&amp;quot;] = math.floor(strip / 4) * 2 + 50;&lt;br /&gt;
&lt;br /&gt;
	elseif lat &amp;gt;= 68 and lat &amp;lt; 80 then											-- Arctic zone&lt;br /&gt;
		lon_limits[&amp;quot;e&amp;quot;] = math.floor(strip / 2) + 48;&lt;br /&gt;
		lon_limits[&amp;quot;w&amp;quot;] = math.floor(strip / 2) + 49;&lt;br /&gt;
		lon_limits[&amp;quot;a_e&amp;quot;] = math.floor(strip / 8) * 4 + 48;&lt;br /&gt;
		lon_limits[&amp;quot;a_w&amp;quot;] = math.floor(strip / 8) * 4 + 52;&lt;br /&gt;
&lt;br /&gt;
	elseif lat &amp;gt;= 80 and lat &amp;lt; 88 then											-- High Arctic zone&lt;br /&gt;
		lon_limits[&amp;quot;e&amp;quot;] = math.floor(strip / 2) + 48;&lt;br /&gt;
		lon_limits[&amp;quot;w&amp;quot;] = math.floor(strip / 2) + 49;&lt;br /&gt;
		lon_limits[&amp;quot;a_e&amp;quot;] = math.floor(strip / 8) * 4 + 48;&lt;br /&gt;
		lon_limits[&amp;quot;a_w&amp;quot;] = math.floor(strip / 8) * 4 + 52;&lt;br /&gt;
	end&lt;br /&gt;
	return {&lt;br /&gt;
		south = lat_limits[&amp;quot;s&amp;quot;], north = lat_limits[&amp;quot;n&amp;quot;], east = lon_limits[&amp;quot;e&amp;quot;], west = lon_limits[&amp;quot;w&amp;quot;],	-- 1:50,000 scale maps&lt;br /&gt;
		area_south = lat_limits[&amp;quot;a_s&amp;quot;], area_north = lat_limits[&amp;quot;a_n&amp;quot;], area_east = lon_limits[&amp;quot;a_e&amp;quot;], area_west = lon_limits[&amp;quot;a_w&amp;quot;]	-- 1:250,000 scale maps&lt;br /&gt;
		}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; N T S _ I D _ F R O M _ L A T _ L O N _ G E T &amp;gt;--------------------------------&lt;br /&gt;
&lt;br /&gt;
calculates NTS identifier from latitude and longitude.  If &amp;lt;lat&amp;gt; and &amp;lt;lon&amp;gt; not supplied, attempts to fetch&lt;br /&gt;
coordinates from wikidata&lt;br /&gt;
&lt;br /&gt;
when successful, returns NTS identifier; nil else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function nts_id_from_lat_long_get (lat, lon)&lt;br /&gt;
	if not (lat and lon) then													-- nil when missing, empty, or not a number&lt;br /&gt;
		lat, lon = wikidata_lat_lon_get();										-- &amp;lt;lat&amp;gt;/&amp;lt;lon&amp;gt; template param(s) invalid or missing; attempt to get &amp;lt;lat&amp;gt;/&amp;lt;lon&amp;gt; from wikidata&lt;br /&gt;
	end&lt;br /&gt;
																				-- wikidata uses negative numbers for west (and south) so must account for that&lt;br /&gt;
	if lat then																	-- normalize coords; assumes that given coords are intended to be on canada nts map&lt;br /&gt;
		if 0 &amp;gt; lat then&lt;br /&gt;
			lat = lat * -1.0;													-- required because wikidata coords are signed&lt;br /&gt;
		end&lt;br /&gt;
		if 0 &amp;gt; lon then&lt;br /&gt;
			lon = lon * -1.0;													-- required because wikidata coords are signed&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return nil;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not lat_lon_validate (lat, lon) then&lt;br /&gt;
		return nil;																-- &amp;lt;lat&amp;gt;/&amp;lt;lon&amp;gt; out of bounds; TODO: better error handling/messaging&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local series, numarea, area, sheet_inter, sheet&lt;br /&gt;
	if lat &amp;gt;= 40 and lat &amp;lt; 68 then												-- Southern zone&lt;br /&gt;
		series = (math.floor((lon - 48) / 8) * 10) + math.floor((lat - 40) / 4)	-- Calculate 1:1,000,000 map series ID&lt;br /&gt;
		numarea = tonumber(math.floor(((lat - 40) / 4) % 1 * 4) * 10 + math.floor(((lon - 48) / 8) % 1 * 4))	-- Calculate 1:250,000 map area ID&lt;br /&gt;
		local southern_zone_t = {[0]=&amp;#039;A&amp;#039;, [1]=&amp;#039;B&amp;#039;, [2]=&amp;#039;C&amp;#039;, [3]=&amp;#039;D&amp;#039;, [13]=&amp;#039;E&amp;#039;, [12]=&amp;#039;F&amp;#039;, [11]=&amp;#039;G&amp;#039;, [10]=&amp;#039;H&amp;#039;, [20]=&amp;#039;I&amp;#039;, [21]=&amp;#039;J&amp;#039;, [22]=&amp;#039;K&amp;#039;, [23]=&amp;#039;L&amp;#039;, [33]=&amp;#039;M&amp;#039;, [32]=&amp;#039;N&amp;#039;, [31]=&amp;#039;O&amp;#039;, [30]=&amp;#039;P&amp;#039;};&lt;br /&gt;
		area = southern_zone_t[numarea];										-- translate&lt;br /&gt;
		sheet_inter = math.floor((lat % 1) * 4) * 10 + math.floor((((lon - 48) / 8) % 1 * 4) % 1 * 4)	-- Calculate 1:50,000 map sheet ID&lt;br /&gt;
&lt;br /&gt;
	elseif lat &amp;gt;= 68 and lat &amp;lt; 80 then											-- Arctic zone&lt;br /&gt;
		series = (math.floor((lon - 48) / 8) * 10) + math.floor((lat - 40) / 4)	-- Calculate 1:1,000,000 map series ID&lt;br /&gt;
		numarea = (math.floor(lat % 4) * 10) + math.floor((lon / 4) % 2)		-- Calculate 1:250,000 map area ID&lt;br /&gt;
		local arctic_zone_t = {[0]=&amp;#039;A&amp;#039;, [1]=&amp;#039;B&amp;#039;, [11]=&amp;#039;C&amp;#039;, [10]=&amp;#039;D&amp;#039;, [20]=&amp;#039;E&amp;#039;, [21]=&amp;#039;F&amp;#039;, [31]=&amp;#039;G&amp;#039;, [30]=&amp;#039;H&amp;#039;};&lt;br /&gt;
		area = arctic_zone_t[numarea];											-- translate&lt;br /&gt;
		sheet_inter = math.floor((lat % 1) * 4) * 10 + math.floor(lon % 4)		-- Calculate 1:50,000 map sheet ID&lt;br /&gt;
&lt;br /&gt;
	elseif lat &amp;gt;= 80 and lat &amp;lt; 88 then											-- High Arctic zone&lt;br /&gt;
		if lon &amp;gt;= 56 and lon &amp;lt; 72 then											-- Calculate 1:1,000,000 map series ID&lt;br /&gt;
			if lat &amp;gt;= 84 then series = 121 else series = 120 end				-- These are correct - Go to &amp;lt;https://maps.canada.ca/czs/index-en.html&amp;gt;, select &amp;quot;Overlay reference layers&amp;quot;, then &amp;quot;National Tiling System grid coverage&amp;quot;&lt;br /&gt;
		elseif lon &amp;gt;= 72 and lon &amp;lt; 88 then										-- there are no maps above 84°N so series 121, 341, and 561 do not exist in National Topographic System, but do exist in National Tiling System&lt;br /&gt;
			if lat &amp;gt;= 84 then series = 341 else series = 340 end&lt;br /&gt;
		elseif lon &amp;gt;= 88 and lon &amp;lt; 104 then&lt;br /&gt;
			if lat &amp;gt;= 84 then series = 561 else series = 560 end&lt;br /&gt;
		elseif lon &amp;gt;= 104 and lon &amp;lt; 120 then									-- These are correct - Go to &amp;lt;https://maps.canada.ca/czs/index-en.html&amp;gt;, select &amp;quot;Overlay reference layers&amp;quot;, then &amp;quot;National Tiling System grid coverage&amp;quot;&lt;br /&gt;
			if lat &amp;gt;= 84 then series = 781 else series = 780 end				-- 780, 781, 910, or 911&lt;br /&gt;
		elseif lon &amp;gt;= 120 and lon &amp;lt; 136 then&lt;br /&gt;
			if lat &amp;gt;= 84 then series = 911 else series = 910 end&lt;br /&gt;
		end -- Remember the difference between the National Topographic System and the National Tiling System&lt;br /&gt;
		&lt;br /&gt;
		numarea = (math.floor(lat % 4) * 10) + (math.floor((lon / 8) + 1) % 2)	-- Calculate 1:250,000 map area ID&lt;br /&gt;
		local high_arctic_zone_t = {[0]=&amp;#039;A&amp;#039;, [1]=&amp;#039;B&amp;#039;, [11]=&amp;#039;C&amp;#039;, [10]=&amp;#039;D&amp;#039;, [20]=&amp;#039;E&amp;#039;, [21]=&amp;#039;F&amp;#039;, [31]=&amp;#039;G&amp;#039;, [30]=&amp;#039;H&amp;#039;};&lt;br /&gt;
		area = high_arctic_zone_t[numarea];										-- translate&lt;br /&gt;
		sheet_inter = math.floor((lat % 1) * 4) * 10 + math.floor((lon % 8) / 2)	-- Calculate 1:50,000 map sheet ID&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local sheet_t = {[0]=1, [1]=2, [2]=3, [3]=4, [13]=5, [12]=6, [11]=7, [10]=8, [20]=9, [21]=10, [22]=11, [23]=12, [33]=13, [32]=14, [31]=15, [30]=16}&lt;br /&gt;
	sheet = sheet_t[sheet_inter]&lt;br /&gt;
&lt;br /&gt;
	return series, area, sheet&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; N T S _ S E R I E S _ V A L I D A T E &amp;gt;----------------------------------------&lt;br /&gt;
&lt;br /&gt;
return &amp;lt;series&amp;gt; as a number when valid and in-bounds; nil else&lt;br /&gt;
&lt;br /&gt;
&amp;lt;series&amp;gt; – must be a map series number as enumerated in File:NTS Zones and Map Series Numbers.png; leading zeros allowed&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function nts_series_validate (series)&lt;br /&gt;
	series = (series and tonumber (series));									-- convert series to a number&lt;br /&gt;
	if not series then&lt;br /&gt;
		return nil;																-- something other than a number; declare failure and abandon&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local series_limits_t = {{1, 3}, {10, 16}, {20, 27}, {29, 49}, {52, 59}, {62, 69}, {72, 79}, {82, 89}, {92, 99}, {102, 107}, {114, 117}, {120, 120}, {340, 340}, {560, 560}}&lt;br /&gt;
&lt;br /&gt;
	for _, limits_t in ipairs (series_limits_t) do								-- loop through the series limits&lt;br /&gt;
		if (series &amp;gt;= limits_t[1]) and (series &amp;lt;= limits_t[2]) then				-- is series within these limits?&lt;br /&gt;
			return series;														-- yes, return series as a number&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; N T S _ A R E A _ V A L I D A T E &amp;gt;--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return &amp;lt;area&amp;gt; when valid and in-bounds; nil else&lt;br /&gt;
&lt;br /&gt;
&amp;lt;area&amp;gt; – must be a single uppercase letter; when &amp;lt;series&amp;gt; identifies a map series in the &lt;br /&gt;
	High Arctic and Arctic zones: [A-H]&lt;br /&gt;
	Southern zone: [A-P]&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function nts_area_validate (series, area)&lt;br /&gt;
	local is_northern;															-- a flag&lt;br /&gt;
	&lt;br /&gt;
	local northern_series_t = {{27, 27}, {29, 29}, {37, 39}, {47, 49}, {57, 59}, {67, 69}, {77, 79}, {87, 89}, {97, 99}, {107, 107}, {117, 117}, {120, 120}, {340, 340}, {560, 560}}&lt;br /&gt;
	for _, limits_t in ipairs (northern_series_t) do&lt;br /&gt;
		if (series &amp;gt;= limits_t[1]) and (series &amp;lt;= limits_t[2]) then				-- is series in arctic or high arctic?&lt;br /&gt;
			is_northern = true;													-- yes, set the flag&lt;br /&gt;
			break;																-- and go on to the next tests&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if is_northern then															-- if arctic or high arctic series&lt;br /&gt;
		if not area:match (&amp;#039;^[A-H]$&amp;#039;) then										-- area must be a single uppercase letter in the range A-H&lt;br /&gt;
			return nil;															-- out of bounds, declare failure and abandon&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- here when southern series&lt;br /&gt;
		if not area:match (&amp;#039;^[A-P]$&amp;#039;) then										-- area must be a single uppercase letter in the range A-P&lt;br /&gt;
			return nil;															-- out of bounds, declare failure and abandon&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return area;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; N T S _ S H E E T _ V A L I D A T E &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return &amp;lt;sheet&amp;gt; when valid and in-bounds; nil else&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sheet&amp;gt; – optional; if present must be a number: [1-16]; leading zeros allowed&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function nts_sheet_validate (sheet)&lt;br /&gt;
	sheet = (sheet and tonumber (sheet)) or nil;								-- sheet as a number; or if not a number or not present, nil&lt;br /&gt;
	&lt;br /&gt;
	if not sheet then&lt;br /&gt;
		return nil;																-- something other than a number; declare failure and abandon&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (1 &amp;gt; sheet) or (16 &amp;lt; sheet) then											-- must be a number in the range 1–16&lt;br /&gt;
		return nil;																-- out of bounds, declare failure and abandon&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return sheet;																-- return sheet as a number&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X T E N T S _ F R O M _ G R I D &amp;gt;--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Calculates bounding boxes of 1:50,000 and 1:250,000 scale map sheets/areas from map sheet ID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;series&amp;gt; is 1:1,000,000 scale map series – a 1-to-three digit number&lt;br /&gt;
&amp;lt;area&amp;gt; is 1:250,000 scale map area – an uppercase letter A-P&lt;br /&gt;
&amp;lt;sheet&amp;gt; is 1:50,000 scale map sheet – a number 1–16&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function extents_from_grid (series, area, sheet)&lt;br /&gt;
	local belt                                                                  -- 192 belts between 40°N and 88°N, each 0.25° of latitude in breadth&lt;br /&gt;
	local belt_area_south = {[&amp;quot;A&amp;quot;]=0, [&amp;quot;B&amp;quot;]=0, [&amp;quot;C&amp;quot;]=0, [&amp;quot;D&amp;quot;]=0, [&amp;quot;E&amp;quot;]=4, [&amp;quot;F&amp;quot;]=4, [&amp;quot;G&amp;quot;]=4, [&amp;quot;H&amp;quot;]=4, [&amp;quot;I&amp;quot;]=8, [&amp;quot;J&amp;quot;]=8, [&amp;quot;K&amp;quot;]=8, [&amp;quot;L&amp;quot;]=8, [&amp;quot;M&amp;quot;]=12, [&amp;quot;N&amp;quot;]=12, [&amp;quot;O&amp;quot;]=12, [&amp;quot;P&amp;quot;]=12}&lt;br /&gt;
	local belt_area_north = {[&amp;quot;A&amp;quot;]=0, [&amp;quot;B&amp;quot;]=0, [&amp;quot;C&amp;quot;]=4, [&amp;quot;D&amp;quot;]=4, [&amp;quot;E&amp;quot;]=8, [&amp;quot;F&amp;quot;]=8, [&amp;quot;G&amp;quot;]=12, [&amp;quot;H&amp;quot;]=12}&lt;br /&gt;
	local belt_sheet = {[1]=0, [2]=0, [3]=0, [4]=0, [5]=1, [6]=1, [7]=1, [8]=1, [9]=2, [10]=2, [11]=2, [12]=2, [13]=3, [14]=3, [15]=3, [16]=3}&lt;br /&gt;
&lt;br /&gt;
	if series &amp;gt;= 120 then&lt;br /&gt;
		belt = 160 + series % 10 * 16 + (belt_area_north[area] or 0) + (belt_sheet[sheet] or 0)&lt;br /&gt;
	elseif series &amp;lt; 120 and series % 10 * 16 &amp;gt;= 112 then&lt;br /&gt;
		belt = series % 10 * 16 + (belt_area_north[area] or 0) + (belt_sheet[sheet] or 0)&lt;br /&gt;
	else&lt;br /&gt;
		belt = series % 10 * 16 + (belt_area_south[area] or 0) + (belt_sheet[sheet] or 0)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local strip																	-- 192 belts between 48°W and 144°W, each 0.5° of longitude in breadth&lt;br /&gt;
	local strip_series_high_arctic = {[12]=16, [34]=48, [56]=80, [78]=112, [91]=144}&lt;br /&gt;
	local strip_area_southern = {[&amp;quot;A&amp;quot;]=0, [&amp;quot;B&amp;quot;]=4, [&amp;quot;C&amp;quot;]=8, [&amp;quot;D&amp;quot;]=12, [&amp;quot;E&amp;quot;]=12, [&amp;quot;F&amp;quot;]=8, [&amp;quot;G&amp;quot;]=4, [&amp;quot;H&amp;quot;]=0, [&amp;quot;I&amp;quot;]=0, [&amp;quot;J&amp;quot;]=4, [&amp;quot;K&amp;quot;]=8, [&amp;quot;L&amp;quot;]=12, [&amp;quot;M&amp;quot;]=12, [&amp;quot;N&amp;quot;]=8, [&amp;quot;O&amp;quot;]=4, [&amp;quot;P&amp;quot;]=0}&lt;br /&gt;
	local strip_area_arctic = {[&amp;quot;A&amp;quot;]=0, [&amp;quot;B&amp;quot;]=8, [&amp;quot;C&amp;quot;]=8, [&amp;quot;D&amp;quot;]=0, [&amp;quot;E&amp;quot;]=0, [&amp;quot;F&amp;quot;]=8, [&amp;quot;G&amp;quot;]=8, [&amp;quot;H&amp;quot;]=0}&lt;br /&gt;
	local strip_area_high_arctic = {[&amp;quot;A&amp;quot;]=0, [&amp;quot;B&amp;quot;]=16, [&amp;quot;C&amp;quot;]=16, [&amp;quot;D&amp;quot;]=0, [&amp;quot;E&amp;quot;]=0, [&amp;quot;F&amp;quot;]=16, [&amp;quot;G&amp;quot;]=16, [&amp;quot;H&amp;quot;]=0}&lt;br /&gt;
&lt;br /&gt;
	local strip_sheet_southern = {[1]=0, [2]=1, [3]=2, [4]=3, [5]=3, [6]=2, [7]=1, [8]=0, [9]=0, [10]=1, [11]=2, [12]=3, [13]=3, [14]=2, [15]=1, [16]=0}&lt;br /&gt;
	local strip_sheet_arctic = {[1]=0, [2]=2, [3]=4, [4]=6, [5]=6, [6]=4, [7]=2, [8]=0, [9]=0, [10]=2, [11]=4, [12]=6, [13]=6, [14]=4, [15]=2, [16]=0}&lt;br /&gt;
	local strip_sheet_high_arctic = {[1]=0, [2]=4, [3]=8, [4]=12, [5]=12, [6]=8, [7]=4, [8]=0, [9]=0, [10]=4, [11]=8, [12]=12, [13]=12, [14]=8, [15]=4, [16]=0}&lt;br /&gt;
&lt;br /&gt;
	local east_limit, west_limit;												-- For 1:50,000 scale map sheet&lt;br /&gt;
	local area_east_limit, area_west_limit;										-- For 1:250,000 scale map area&lt;br /&gt;
&lt;br /&gt;
	if series &amp;gt;= 120 then														-- High Arctic zone&lt;br /&gt;
		strip = strip_series_high_arctic[math.floor(series / 10)] + (strip_area_high_arctic[area] or 0) + (strip_sheet_high_arctic[sheet] or 0);&lt;br /&gt;
&lt;br /&gt;
		east_limit = strip * 0.5 + 48&lt;br /&gt;
		west_limit = (strip + 4) * 0.5 + 48&lt;br /&gt;
		area_east_limit = math.floor(strip / 16) * 8 + 48&lt;br /&gt;
		area_west_limit = math.floor((strip + 16) / 16) * 8 + 48&lt;br /&gt;
&lt;br /&gt;
	elseif series &amp;lt; 120 and math.floor(series % 10) &amp;gt;= 7 then					-- Arctic zone&lt;br /&gt;
		strip = math.floor(series / 10) * 16 + (strip_area_arctic[area] or 0) + (strip_sheet_arctic[sheet] or 0);&lt;br /&gt;
&lt;br /&gt;
		east_limit = strip * 0.5 + 48&lt;br /&gt;
		west_limit = (strip + 2) * 0.5 + 48&lt;br /&gt;
		area_east_limit = math.floor(strip / 8) * 4 + 48&lt;br /&gt;
		area_west_limit = math.floor((strip + 8) / 8) * 4 + 48&lt;br /&gt;
&lt;br /&gt;
	else																		-- Southern zone&lt;br /&gt;
		strip = math.floor(series / 10) * 16 + (strip_area_southern[area] or 0) + (strip_sheet_southern[sheet] or 0);&lt;br /&gt;
&lt;br /&gt;
		east_limit = strip * 0.5 + 48&lt;br /&gt;
		west_limit = (strip + 1) * 0.5 + 48&lt;br /&gt;
		area_east_limit = math.floor(strip / 4) * 2 + 48&lt;br /&gt;
		area_west_limit = math.floor((strip + 4) / 4) * 2 + 48&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local grid_limits = {&lt;br /&gt;
		[&amp;quot;south&amp;quot;] = belt * 0.25 + 40,&lt;br /&gt;
		[&amp;quot;north&amp;quot;] = belt * 0.25 + 40.25,&lt;br /&gt;
		[&amp;quot;area_south&amp;quot;] = math.floor(belt / 4) + 40,&lt;br /&gt;
		[&amp;quot;area_north&amp;quot;] = math.floor(belt / 4) + 41,&lt;br /&gt;
		[&amp;quot;east&amp;quot;] = east_limit,&lt;br /&gt;
		[&amp;quot;west&amp;quot;] = west_limit,&lt;br /&gt;
		[&amp;quot;area_east&amp;quot;] = area_east_limit,&lt;br /&gt;
		[&amp;quot;area_west&amp;quot;] = area_west_limit&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	return grid_limits&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G R I D &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
This function takes a Canadian National Tiling System map sheet ID, or latitude and longitude either as input or&lt;br /&gt;
from the wikidata qid of the current page and creates a url for the map sheet.  Latitude and longitude are in&lt;br /&gt;
decimal degrees, and automatically assumed to be north and west, as no Canadian territory lies in the southern&lt;br /&gt;
or eastern hemispheres.&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Canada NTS|grid}} 													-- For 1:50,000 scale map sheet ID, using coordinates from current article&amp;#039;s Wikidata entry&lt;br /&gt;
{{#invoke:Canada NTS|grid|&amp;lt;series&amp;gt;|&amp;lt;area&amp;gt;|&amp;lt;sheet&amp;gt;}}								-- For 1:50,000 scale map sheet ID, using NTS ID (see Template:Canada NTS Map Sheet)&lt;br /&gt;
{{#invoke:Canada NTS|grid|lat=&amp;lt;number&amp;gt;|lon=&amp;lt;number&amp;gt;}}							-- For 1:50,000 scale map sheet ID, using coordinates specified in argument&lt;br /&gt;
&lt;br /&gt;
optional parameters:&lt;br /&gt;
	|area= to obtain a 1:250,000 scale map area ID instead&lt;br /&gt;
	|link= to create an appropriate link to the Canadian government&amp;#039;s Geospatial Data Extraction tool&lt;br /&gt;
	|name= to append the map name (from Module:Canada_NTS/data) to the output&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function grid (frame)&lt;br /&gt;
	local args_t = get_args (frame);											-- fetch frame and parent frame parameters into a single table&lt;br /&gt;
	local lat, lon = tonumber(args_t.lat), tonumber(args_t.lon);&lt;br /&gt;
																				-- flags to control what the output looks like&lt;br /&gt;
	local print_area = &amp;#039;yes&amp;#039; == args_t.area;									-- when true, render only the &amp;#039;area&amp;#039; portion &amp;#039;30M&amp;#039; instead of sheet &amp;#039;30M11&amp;#039;&lt;br /&gt;
	local print_link = &amp;#039;yes&amp;#039; == args_t.link;									-- when true, format the area or sheet output as an external link&lt;br /&gt;
	local print_name = &amp;#039;yes&amp;#039; == args_t.name;									-- when true, append map name from ~/data&lt;br /&gt;
&lt;br /&gt;
	local series, area, sheet;&lt;br /&gt;
	for k, v in ipairs (args_t) do&lt;br /&gt;
		if 1 == k then															-- args_t[1] to series; must be a one-to-three digit number&lt;br /&gt;
			series = nts_series_validate (args_t[1]);&lt;br /&gt;
			if not series then&lt;br /&gt;
				return &amp;#039;&amp;lt;span style=&amp;quot;color:#d33&amp;quot;&amp;gt;invalid NTS series input&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
			end&lt;br /&gt;
			lat = nil;															-- unset these if present because we won&amp;#039;t be using them when we have nts id (which may or may not be good)&lt;br /&gt;
			lon = nil;&lt;br /&gt;
&lt;br /&gt;
		elseif 2 == k then														-- args_t[2] to area; must one uppercase letter A-P&lt;br /&gt;
			area = nts_area_validate (series, args_t[2]);&lt;br /&gt;
			if not area then&lt;br /&gt;
				return &amp;#039;&amp;lt;span style=&amp;quot;color:#d33&amp;quot;&amp;gt;invalid NTS area input&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
		elseif 3 == k then														-- args_t[3] to sheet; must be a number 1-16&lt;br /&gt;
			sheet = nts_sheet_validate (args_t[3]);&lt;br /&gt;
			if not sheet then&lt;br /&gt;
				return &amp;#039;&amp;lt;span style=&amp;quot;color:#d33&amp;quot;&amp;gt;invalid NTS sheet input&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if series and not sheet then												-- if we have nts id without sheet (an area-only)&lt;br /&gt;
		print_area = true;														-- set this so that later we create the correct output&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not series or not area then&lt;br /&gt;
		series, area, sheet = nts_id_from_lat_long_get (lat, lon);&lt;br /&gt;
		if not series then&lt;br /&gt;
			return &amp;#039;&amp;lt;span style=&amp;quot;color:#d33&amp;quot;&amp;gt;lat/long input fail&amp;lt;/span&amp;gt;&amp;#039;;		-- TODO: better, more informative error handling&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local output = print_area and (series .. area) or (series .. area .. sheet);&lt;br /&gt;
	print_name = print_name and (&amp;#039; &amp;#039; .. _name ({output})) or &amp;#039;&amp;#039;;				-- reuse &amp;lt;print_name&amp;gt; to hold name or empty string&lt;br /&gt;
&lt;br /&gt;
	local extents_t = {};														-- to hold bounding box coordinates for url&lt;br /&gt;
	if print_link and lat then													-- when we have lat/lon&lt;br /&gt;
		extents_t = extents (lat, lon);											-- get a table of sheet and area extents from lat/lon&lt;br /&gt;
	elseif print_link then														-- when we have nts id&lt;br /&gt;
		extents_t = extents_from_grid (series, area, sheet);					-- get a table of sheet and area extents from nts id parts&lt;br /&gt;
		if extents_t == nil then&lt;br /&gt;
			return &amp;#039;&amp;lt;span style=&amp;quot;color:#d33&amp;quot;&amp;gt;NTS identifier input fail&amp;lt;/span&amp;gt;&amp;#039;;	-- TODO: better, more informative error handling&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		print_link = nil;														-- unset because we can&amp;#039;t create a link&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if print_link then&lt;br /&gt;
		local ext_link_fmt_str = &amp;#039;[https://maps.canada.ca/czs/index-en.html?bbox=-%s,%s,-%s,%s&amp;amp;name=NTS_map_sheet_%s %s]&amp;#039;;&lt;br /&gt;
		output = print_area and string.format (ext_link_fmt_str, extents_t.area_west, extents_t.area_south, extents_t.area_east, extents_t.area_north, output, output) or&lt;br /&gt;
					string.format (ext_link_fmt_str, extents_t.west, extents_t.south, extents_t.east, extents_t.north, output, output);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output = output .. print_name;												-- append name or empty string&lt;br /&gt;
	return output;																-- and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; D O C _ S U P P O R T &amp;gt;--------------------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function doc_support (frame)&lt;br /&gt;
	local args_t = get_args (frame);											-- fetch frame and parent frame parameters into a single table&lt;br /&gt;
	local data = mw.loadData (&amp;#039;Module:Canada NTS/data&amp;#039;);						-- load the ~/data module&lt;br /&gt;
	local lang_obj = mw.language.getContentLanguage();							-- get language object for number formatting&lt;br /&gt;
	local count = 0;															-- a generic counter &lt;br /&gt;
	local area_count = 0;														-- counter for area maps (1:250,000)&lt;br /&gt;
	local sheet_count = 0;														-- counter for sheet maps (1:50,000)&lt;br /&gt;
	&lt;br /&gt;
	if &amp;#039;count&amp;#039; == args_t[1] then												-- count the number of entries in ~/data&lt;br /&gt;
		for k, _ in pairs (data) do												-- don&amp;#039;t care about key and value&lt;br /&gt;
			if k:match (&amp;#039;[A-P]$&amp;#039;) then&lt;br /&gt;
				area_count = area_count + 1;									-- bump the counter&lt;br /&gt;
			else&lt;br /&gt;
				sheet_count = sheet_count + 1;									-- bump the counter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return string.format (&amp;#039;%s (1:250,000: %s; 1:50,000: %s)&amp;#039;, lang_obj:formatNum (sheet_count + area_count), lang_obj:formatNum (area_count), lang_obj:formatNum (sheet_count));&lt;br /&gt;
		&lt;br /&gt;
	elseif &amp;#039;untitled&amp;#039; == args_t[1] then											-- count the number of entries in ~/data that do not have a NTS title&lt;br /&gt;
		for _, v in pairs (data) do												-- don&amp;#039;t care about key&lt;br /&gt;
			if &amp;#039;&amp;#039; == v then														-- when value is empty string, no title so&lt;br /&gt;
				count = count + 1;												-- bump the counter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return lang_obj:formatNum(count);											-- make all pretty-like and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	grid = grid,																-- entry points from invokes&lt;br /&gt;
	name = name,&lt;br /&gt;
	doc_support = doc_support,&lt;br /&gt;
	&lt;br /&gt;
	extents_from_grid = extents_from_grid,										-- entry points when this module is require()d into other modules&lt;br /&gt;
	nts_series_validate = nts_series_validate,&lt;br /&gt;
	nts_area_validate = nts_area_validate,&lt;br /&gt;
	nts_sheet_validate = nts_sheet_validate,&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>imported&gt;WOSlinker</name></author>
	</entry>
</feed>