Repository: PeteRager/lennoxs30api (language: python)

Issue:
Support S40 weather



Discussion / hints:

Fix patch:
diff --git a/coverage.xml b/coverage.xml
index 5f33884..b4d0d58 100644
--- a/coverage.xml
+++ b/coverage.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" ?>
-<coverage version="7.2.1" timestamp="1687463912642" lines-valid="7777" lines-covered="7521" line-rate="0.9671" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
+<coverage version="7.2.1" timestamp="1696282587886" lines-valid="7808" lines-covered="7551" line-rate="0.9671" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
 	<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.2.1 -->
 	<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
 	<sources>
 		<source>/mnt/c/github/lennoxs30api</source>
 	</sources>
 	<packages>
-		<package name="lennoxs30api" line-rate="0.9299" branch-rate="0" complexity="0">
+		<package name="lennoxs30api" line-rate="0.9303" branch-rate="0" complexity="0">
 			<classes>
 				<class name="__init__.py" filename="lennoxs30api/__init__.py" complexity="0" line-rate="1" branch-rate="0">
 					<methods/>
@@ -618,7 +618,7 @@
 						<line number="117" hits="1"/>
 					</lines>
 				</class>
-				<class name="s30api_async.py" filename="lennoxs30api/s30api_async.py" complexity="0" line-rate="0.9105" branch-rate="0">
+				<class name="s30api_async.py" filename="lennoxs30api/s30api_async.py" complexity="0" line-rate="0.911" branch-rate="0">
 					<methods/>
 					<lines>
 						<line number="29" hits="1"/>
@@ -726,36 +726,35 @@
 						<line number="224" hits="1"/>
 						<line number="227" hits="1"/>
 						<line number="231" hits="1"/>
-						<line number="253" hits="1"/>
 						<line number="254" hits="1"/>
 						<line number="255" hits="1"/>
 						<line number="256" hits="1"/>
 						<line number="257" hits="1"/>
 						<line number="258" hits="1"/>
 						<line number="259" hits="1"/>
+						<line number="260" hits="1"/>
 						<line number="261" hits="1"/>
-						<line number="262" hits="1"/>
 						<line number="263" hits="1"/>
 						<line number="264" hits="1"/>
 						<line number="265" hits="1"/>
 						<line number="266" hits="1"/>
 						<line number="267" hits="1"/>
+						<line number="268" hits="1"/>
 						<line number="269" hits="1"/>
-						<line number="270" hits="1"/>
 						<line number="271" hits="1"/>
 						<line number="272" hits="1"/>
 						<line number="273" hits="1"/>
 						<line number="274" hits="1"/>
+						<line number="275" hits="1"/>
 						<line number="276" hits="1"/>
-						<line number="277" hits="1"/>
-						<line number="280" hits="1"/>
-						<line number="281" hits="1"/>
+						<line number="278" hits="1"/>
+						<line number="279" hits="1"/>
 						<line number="282" hits="1"/>
 						<line number="283" hits="1"/>
 						<line number="284" hits="1"/>
 						<line number="285" hits="1"/>
+						<line number="286" hits="1"/>
 						<line number="287" hits="1"/>
-						<line number="288" hits="1"/>
 						<line number="289" hits="1"/>
 						<line number="290" hits="1"/>
 						<line number="291" hits="1"/>
@@ -767,38 +766,38 @@
 						<line number="297" hits="1"/>
 						<line number="298" hits="1"/>
 						<line number="299" hits="1"/>
+						<line number="300" hits="1"/>
 						<line number="301" hits="1"/>
-						<line number="302" hits="1"/>
 						<line number="303" hits="1"/>
 						<line number="304" hits="1"/>
 						<line number="305" hits="1"/>
 						<line number="306" hits="1"/>
 						<line number="307" hits="1"/>
 						<line number="308" hits="1"/>
+						<line number="309" hits="1"/>
 						<line number="310" hits="1"/>
-						<line number="311" hits="1"/>
 						<line number="312" hits="1"/>
 						<line number="313" hits="1"/>
+						<line number="314" hits="1"/>
 						<line number="315" hits="1"/>
-						<line number="316" hits="1"/>
+						<line number="317" hits="1"/>
 						<line number="318" hits="1"/>
-						<line number="319" hits="1"/>
 						<line number="320" hits="1"/>
 						<line number="321" hits="1"/>
 						<line number="322" hits="1"/>
 						<line number="323" hits="1"/>
 						<line number="324" hits="1"/>
 						<line number="325" hits="1"/>
+						<line number="326" hits="1"/>
 						<line number="327" hits="1"/>
-						<line number="328" hits="1"/>
 						<line number="329" hits="1"/>
+						<line number="330" hits="1"/>
 						<line number="331" hits="1"/>
 						<line number="333" hits="1"/>
-						<line number="334" hits="1"/>
 						<line number="335" hits="1"/>
 						<line number="336" hits="1"/>
+						<line number="337" hits="1"/>
 						<line number="338" hits="1"/>
-						<line number="339" hits="1"/>
 						<line number="340" hits="1"/>
 						<line number="341" hits="1"/>
 						<line number="342" hits="1"/>
@@ -807,8 +806,8 @@
 						<line number="345" hits="1"/>
 						<line number="346" hits="1"/>
 						<line number="347" hits="1"/>
-						<line number="355" hits="1"/>
-						<line number="356" hits="1"/>
+						<line number="348" hits="1"/>
+						<line number="349" hits="1"/>
 						<line number="357" hits="1"/>
 						<line number="358" hits="1"/>
 						<line number="359" hits="1"/>
@@ -821,8 +820,8 @@
 						<line number="366" hits="1"/>
 						<line number="367" hits="1"/>
 						<line number="368" hits="1"/>
+						<line number="369" hits="1"/>
 						<line number="370" hits="1"/>
-						<line number="371" hits="1"/>
 						<line number="372" hits="1"/>
 						<line number="373" hits="1"/>
 						<line number="374" hits="1"/>
@@ -830,142 +829,142 @@
 						<line number="376" hits="1"/>
 						<line number="377" hits="1"/>
 						<line number="378" hits="1"/>
+						<line number="379" hits="1"/>
 						<line number="380" hits="1"/>
-						<line number="381" hits="1"/>
 						<line number="382" hits="1"/>
 						<line number="383" hits="1"/>
+						<line number="384" hits="1"/>
 						<line number="385" hits="1"/>
 						<line number="387" hits="1"/>
-						<line number="388" hits="1"/>
 						<line number="389" hits="1"/>
 						<line number="390" hits="1"/>
 						<line number="391" hits="1"/>
 						<line number="392" hits="1"/>
 						<line number="393" hits="1"/>
 						<line number="394" hits="1"/>
+						<line number="395" hits="1"/>
 						<line number="396" hits="1"/>
 						<line number="398" hits="1"/>
-						<line number="401" hits="1"/>
-						<line number="402" hits="1"/>
+						<line number="400" hits="1"/>
 						<line number="403" hits="1"/>
 						<line number="404" hits="1"/>
 						<line number="405" hits="1"/>
 						<line number="406" hits="1"/>
 						<line number="407" hits="1"/>
-						<line number="411" hits="1"/>
-						<line number="412" hits="1"/>
+						<line number="408" hits="1"/>
+						<line number="409" hits="1"/>
 						<line number="413" hits="1"/>
 						<line number="414" hits="1"/>
 						<line number="415" hits="1"/>
 						<line number="416" hits="1"/>
 						<line number="417" hits="1"/>
+						<line number="418" hits="1"/>
 						<line number="419" hits="1"/>
-						<line number="422" hits="1"/>
-						<line number="423" hits="1"/>
+						<line number="421" hits="1"/>
 						<line number="424" hits="1"/>
 						<line number="425" hits="1"/>
 						<line number="426" hits="1"/>
 						<line number="427" hits="1"/>
 						<line number="428" hits="1"/>
 						<line number="429" hits="1"/>
-						<line number="434" hits="1"/>
-						<line number="435" hits="1"/>
+						<line number="430" hits="1"/>
+						<line number="431" hits="1"/>
 						<line number="436" hits="1"/>
 						<line number="437" hits="1"/>
 						<line number="438" hits="1"/>
 						<line number="439" hits="1"/>
+						<line number="440" hits="1"/>
 						<line number="441" hits="1"/>
-						<line number="442" hits="1"/>
 						<line number="443" hits="1"/>
 						<line number="444" hits="1"/>
 						<line number="445" hits="1"/>
+						<line number="446" hits="1"/>
 						<line number="447" hits="1"/>
-						<line number="448" hits="1"/>
 						<line number="449" hits="1"/>
 						<line number="450" hits="1"/>
 						<line number="451" hits="1"/>
 						<line number="452" hits="1"/>
 						<line number="453" hits="1"/>
+						<line number="454" hits="1"/>
 						<line number="455" hits="1"/>
-						<line number="456" hits="1"/>
 						<line number="457" hits="1"/>
 						<line number="458" hits="1"/>
 						<line number="459" hits="1"/>
+						<line number="460" hits="1"/>
 						<line number="461" hits="1"/>
-						<line number="462" hits="1"/>
+						<line number="463" hits="1"/>
 						<line number="464" hits="1"/>
 						<line number="466" hits="1"/>
-						<line number="467" hits="1"/>
 						<line number="468" hits="1"/>
 						<line number="469" hits="1"/>
 						<line number="470" hits="1"/>
 						<line number="471" hits="1"/>
 						<line number="472" hits="1"/>
 						<line number="473" hits="1"/>
+						<line number="474" hits="1"/>
 						<line number="475" hits="1"/>
 						<line number="477" hits="1"/>
-						<line number="478" hits="1"/>
 						<line number="479" hits="1"/>
 						<line number="480" hits="1"/>
 						<line number="481" hits="1"/>
 						<line number="482" hits="1"/>
+						<line number="483" hits="1"/>
 						<line number="484" hits="1"/>
 						<line number="486" hits="1"/>
-						<line number="487" hits="1"/>
 						<line number="488" hits="1"/>
 						<line number="489" hits="1"/>
 						<line number="490" hits="1"/>
 						<line number="491" hits="1"/>
 						<line number="492" hits="1"/>
-						<line number="497" hits="1"/>
+						<line number="493" hits="1"/>
+						<line number="494" hits="1"/>
 						<line number="499" hits="1"/>
-						<line number="508" hits="1"/>
-						<line number="513" hits="1"/>
-						<line number="514" hits="1"/>
+						<line number="501" hits="1"/>
+						<line number="510" hits="1"/>
 						<line number="515" hits="1"/>
 						<line number="516" hits="1"/>
-						<line number="521" hits="1"/>
-						<line number="522" hits="1"/>
+						<line number="517" hits="1"/>
+						<line number="518" hits="1"/>
 						<line number="523" hits="1"/>
 						<line number="524" hits="1"/>
 						<line number="525" hits="1"/>
 						<line number="526" hits="1"/>
 						<line number="527" hits="1"/>
 						<line number="528" hits="1"/>
-						<line number="533" hits="1"/>
-						<line number="534" hits="0"/>
-						<line number="539" hits="1"/>
-						<line number="540" hits="1"/>
+						<line number="529" hits="1"/>
+						<line number="530" hits="1"/>
+						<line number="535" hits="1"/>
+						<line number="536" hits="0"/>
 						<line number="541" hits="1"/>
 						<line number="542" hits="1"/>
 						<line number="543" hits="1"/>
 						<line number="544" hits="1"/>
 						<line number="545" hits="1"/>
+						<line number="546" hits="1"/>
 						<line number="547" hits="1"/>
 						<line number="549" hits="1"/>
 						<line number="551" hits="1"/>
-						<line number="552" hits="1"/>
-						<line number="555" hits="1"/>
-						<line number="556" hits="1"/>
+						<line number="553" hits="1"/>
+						<line number="554" hits="1"/>
 						<line number="557" hits="1"/>
 						<line number="558" hits="1"/>
 						<line number="559" hits="1"/>
 						<line number="560" hits="1"/>
 						<line number="561" hits="1"/>
+						<line number="562" hits="1"/>
 						<line number="563" hits="1"/>
 						<line number="565" hits="1"/>
-						<line number="566" hits="1"/>
 						<line number="567" hits="1"/>
 						<line number="568" hits="1"/>
+						<line number="569" hits="1"/>
 						<line number="570" hits="1"/>
-						<line number="571" hits="1"/>
 						<line number="572" hits="1"/>
 						<line number="573" hits="1"/>
-						<line number="574" hits="0"/>
+						<line number="574" hits="1"/>
 						<line number="575" hits="1"/>
+						<line number="576" hits="0"/>
 						<line number="577" hits="1"/>
 						<line number="579" hits="1"/>
-						<line number="580" hits="1"/>
 						<line number="581" hits="1"/>
 						<line number="582" hits="1"/>
 						<line number="583" hits="1"/>
@@ -974,195 +973,195 @@
 						<line number="586" hits="1"/>
 						<line number="587" hits="1"/>
 						<line number="588" hits="1"/>
+						<line number="589" hits="1"/>
 						<line number="590" hits="1"/>
-						<line number="591" hits="1"/>
-						<line number="594" hits="1"/>
-						<line number="595" hits="1"/>
+						<line number="592" hits="1"/>
+						<line number="593" hits="1"/>
 						<line number="596" hits="1"/>
-						<line number="599" hits="1"/>
-						<line number="600" hits="1"/>
+						<line number="597" hits="1"/>
+						<line number="598" hits="1"/>
 						<line number="601" hits="1"/>
 						<line number="602" hits="1"/>
-						<line number="607" hits="1"/>
-						<line number="608" hits="1"/>
+						<line number="603" hits="1"/>
+						<line number="604" hits="1"/>
 						<line number="609" hits="1"/>
 						<line number="610" hits="1"/>
-						<line number="611" hits="0"/>
-						<line number="612" hits="0"/>
-						<line number="616" hits="1"/>
-						<line number="617" hits="1"/>
+						<line number="611" hits="1"/>
+						<line number="612" hits="1"/>
+						<line number="613" hits="0"/>
+						<line number="614" hits="0"/>
 						<line number="618" hits="1"/>
 						<line number="619" hits="1"/>
 						<line number="620" hits="1"/>
-						<line number="624" hits="1"/>
-						<line number="625" hits="1"/>
-						<line number="630" hits="1"/>
-						<line number="631" hits="1"/>
+						<line number="621" hits="1"/>
+						<line number="622" hits="1"/>
+						<line number="626" hits="1"/>
+						<line number="627" hits="1"/>
 						<line number="632" hits="1"/>
 						<line number="633" hits="1"/>
 						<line number="634" hits="1"/>
 						<line number="635" hits="1"/>
 						<line number="636" hits="1"/>
 						<line number="637" hits="1"/>
-						<line number="640" hits="1"/>
-						<line number="641" hits="1"/>
+						<line number="638" hits="1"/>
+						<line number="639" hits="1"/>
 						<line number="642" hits="1"/>
 						<line number="643" hits="1"/>
 						<line number="644" hits="1"/>
-						<line number="648" hits="1"/>
-						<line number="649" hits="1"/>
-						<line number="653" hits="1"/>
-						<line number="654" hits="1"/>
+						<line number="645" hits="1"/>
+						<line number="646" hits="1"/>
+						<line number="650" hits="1"/>
+						<line number="651" hits="1"/>
 						<line number="655" hits="1"/>
 						<line number="656" hits="1"/>
 						<line number="657" hits="1"/>
 						<line number="658" hits="1"/>
 						<line number="659" hits="1"/>
 						<line number="660" hits="1"/>
+						<line number="661" hits="1"/>
 						<line number="662" hits="1"/>
-						<line number="669" hits="1"/>
-						<line number="670" hits="1"/>
+						<line number="664" hits="1"/>
 						<line number="671" hits="1"/>
-						<line number="678" hits="1"/>
-						<line number="683" hits="1"/>
-						<line number="684" hits="0"/>
-						<line number="686" hits="1"/>
+						<line number="672" hits="1"/>
+						<line number="673" hits="1"/>
+						<line number="680" hits="1"/>
+						<line number="685" hits="1"/>
+						<line number="686" hits="0"/>
 						<line number="688" hits="1"/>
-						<line number="689" hits="1"/>
 						<line number="690" hits="1"/>
-						<line number="691" hits="0"/>
-						<line number="692" hits="0"/>
+						<line number="691" hits="1"/>
+						<line number="692" hits="1"/>
 						<line number="693" hits="0"/>
 						<line number="694" hits="0"/>
 						<line number="695" hits="0"/>
 						<line number="696" hits="0"/>
+						<line number="697" hits="0"/>
 						<line number="698" hits="0"/>
-						<line number="699" hits="1"/>
-						<line number="700" hits="1"/>
+						<line number="700" hits="0"/>
+						<line number="701" hits="1"/>
 						<line number="702" hits="1"/>
 						<line number="704" hits="1"/>
-						<line number="705" hits="1"/>
 						<line number="706" hits="1"/>
 						<line number="707" hits="1"/>
 						<line number="708" hits="1"/>
-						<line number="709" hits="0"/>
+						<line number="709" hits="1"/>
 						<line number="710" hits="1"/>
-						<line number="711" hits="1"/>
+						<line number="711" hits="0"/>
 						<line number="712" hits="1"/>
 						<line number="713" hits="1"/>
 						<line number="714" hits="1"/>
 						<line number="715" hits="1"/>
 						<line number="716" hits="1"/>
 						<line number="717" hits="1"/>
-						<line number="719" hits="0"/>
-						<line number="720" hits="0"/>
-						<line number="722" hits="1"/>
-						<line number="723" hits="1"/>
+						<line number="718" hits="1"/>
+						<line number="719" hits="1"/>
+						<line number="721" hits="0"/>
+						<line number="722" hits="0"/>
+						<line number="724" hits="1"/>
 						<line number="725" hits="1"/>
-						<line number="726" hits="1"/>
+						<line number="727" hits="1"/>
 						<line number="728" hits="1"/>
-						<line number="729" hits="1"/>
 						<line number="730" hits="1"/>
 						<line number="731" hits="1"/>
+						<line number="732" hits="1"/>
 						<line number="733" hits="1"/>
-						<line number="734" hits="1"/>
 						<line number="735" hits="1"/>
 						<line number="736" hits="1"/>
 						<line number="737" hits="1"/>
+						<line number="738" hits="1"/>
 						<line number="739" hits="1"/>
-						<line number="742" hits="1"/>
+						<line number="741" hits="1"/>
 						<line number="744" hits="1"/>
-						<line number="745" hits="1"/>
 						<line number="746" hits="1"/>
-						<line number="750" hits="1"/>
-						<line number="753" hits="1"/>
-						<line number="754" hits="1"/>
+						<line number="747" hits="1"/>
+						<line number="748" hits="1"/>
+						<line number="752" hits="1"/>
+						<line number="755" hits="1"/>
 						<line number="756" hits="1"/>
-						<line number="757" hits="1"/>
 						<line number="758" hits="1"/>
 						<line number="759" hits="1"/>
 						<line number="760" hits="1"/>
-						<line number="769" hits="1"/>
-						<line number="770" hits="1"/>
+						<line number="761" hits="1"/>
+						<line number="762" hits="1"/>
 						<line number="771" hits="1"/>
 						<line number="772" hits="1"/>
 						<line number="773" hits="1"/>
 						<line number="774" hits="1"/>
 						<line number="775" hits="1"/>
+						<line number="776" hits="1"/>
 						<line number="777" hits="1"/>
-						<line number="778" hits="1"/>
 						<line number="779" hits="1"/>
 						<line number="780" hits="1"/>
+						<line number="781" hits="1"/>
 						<line number="782" hits="1"/>
-						<line number="783" hits="0"/>
-						<line number="784" hits="0"/>
+						<line number="784" hits="1"/>
 						<line number="785" hits="0"/>
-						<line number="787" hits="1"/>
-						<line number="788" hits="1"/>
+						<line number="786" hits="0"/>
+						<line number="787" hits="0"/>
 						<line number="789" hits="1"/>
+						<line number="790" hits="1"/>
 						<line number="791" hits="1"/>
-						<line number="792" hits="1"/>
 						<line number="793" hits="1"/>
 						<line number="794" hits="1"/>
 						<line number="795" hits="1"/>
 						<line number="796" hits="1"/>
 						<line number="797" hits="1"/>
 						<line number="798" hits="1"/>
-						<line number="803" hits="1"/>
-						<line number="804" hits="1"/>
+						<line number="799" hits="1"/>
+						<line number="800" hits="1"/>
 						<line number="805" hits="1"/>
 						<line number="806" hits="1"/>
-						<line number="807" hits="0"/>
-						<line number="808" hits="0"/>
-						<line number="814" hits="1"/>
-						<line number="815" hits="1"/>
+						<line number="807" hits="1"/>
+						<line number="808" hits="1"/>
+						<line number="809" hits="0"/>
+						<line number="810" hits="0"/>
 						<line number="816" hits="1"/>
 						<line number="817" hits="1"/>
 						<line number="818" hits="1"/>
+						<line number="819" hits="1"/>
 						<line number="820" hits="1"/>
-						<line number="821" hits="1"/>
 						<line number="822" hits="1"/>
 						<line number="823" hits="1"/>
 						<line number="824" hits="1"/>
+						<line number="825" hits="1"/>
 						<line number="826" hits="1"/>
-						<line number="827" hits="1"/>
 						<line number="828" hits="1"/>
-						<line number="829" hits="0"/>
+						<line number="829" hits="1"/>
 						<line number="830" hits="1"/>
-						<line number="831" hits="1"/>
+						<line number="831" hits="0"/>
 						<line number="832" hits="1"/>
-						<line number="835" hits="1"/>
-						<line number="836" hits="1"/>
+						<line number="833" hits="1"/>
+						<line number="834" hits="1"/>
 						<line number="837" hits="1"/>
 						<line number="838" hits="1"/>
+						<line number="839" hits="1"/>
 						<line number="840" hits="1"/>
-						<line number="841" hits="1"/>
 						<line number="842" hits="1"/>
 						<line number="843" hits="1"/>
-						<line number="844" hits="0"/>
-						<line number="847" hits="0"/>
-						<line number="848" hits="0"/>
-						<line number="849" hits="1"/>
-						<line number="856" hits="1"/>
-						<line number="857" hits="1"/>
+						<line number="844" hits="1"/>
+						<line number="845" hits="1"/>
+						<line number="846" hits="0"/>
+						<line number="849" hits="0"/>
+						<line number="850" hits="0"/>
+						<line number="851" hits="1"/>
 						<line number="858" hits="1"/>
-						<line number="859" hits="0"/>
-						<line number="860" hits="0"/>
+						<line number="859" hits="1"/>
+						<line number="860" hits="1"/>
 						<line number="861" hits="0"/>
 						<line number="862" hits="0"/>
 						<line number="863" hits="0"/>
 						<line number="864" hits="0"/>
-						<line number="865" hits="1"/>
+						<line number="865" hits="0"/>
+						<line number="866" hits="0"/>
 						<line number="867" hits="1"/>
-						<line number="868" hits="1"/>
 						<line number="869" hits="1"/>
+						<line number="870" hits="1"/>
 						<line number="871" hits="1"/>
-						<line number="872" hits="1"/>
 						<line number="873" hits="1"/>
 						<line number="874" hits="1"/>
 						<line number="875" hits="1"/>
-						<line number="884" hits="1"/>
-						<line number="885" hits="1"/>
+						<line number="876" hits="1"/>
+						<line number="877" hits="1"/>
 						<line number="886" hits="1"/>
 						<line number="887" hits="1"/>
 						<line number="888" hits="1"/>
@@ -1170,77 +1169,77 @@
 						<line number="890" hits="1"/>
 						<line number="891" hits="1"/>
 						<line number="892" hits="1"/>
-						<line number="895" hits="1"/>
-						<line number="896" hits="1"/>
+						<line number="893" hits="1"/>
+						<line number="894" hits="1"/>
 						<line number="897" hits="1"/>
 						<line number="898" hits="1"/>
 						<line number="899" hits="1"/>
 						<line number="900" hits="1"/>
-						<line number="905" hits="1"/>
-						<line number="906" hits="1"/>
+						<line number="901" hits="1"/>
+						<line number="902" hits="1"/>
 						<line number="907" hits="1"/>
 						<line number="908" hits="1"/>
 						<line number="909" hits="1"/>
-						<line number="914" hits="1"/>
-						<line number="915" hits="1"/>
-						<line number="920" hits="1"/>
-						<line number="921" hits="1"/>
-						<line number="926" hits="1"/>
-						<line number="927" hits="1"/>
+						<line number="910" hits="1"/>
+						<line number="911" hits="1"/>
+						<line number="916" hits="1"/>
+						<line number="917" hits="1"/>
+						<line number="922" hits="1"/>
+						<line number="923" hits="1"/>
 						<line number="928" hits="1"/>
 						<line number="929" hits="1"/>
 						<line number="930" hits="1"/>
 						<line number="931" hits="1"/>
 						<line number="932" hits="1"/>
-						<line number="933" hits="0"/>
-						<line number="934" hits="0"/>
-						<line number="939" hits="1"/>
+						<line number="933" hits="1"/>
+						<line number="934" hits="1"/>
+						<line number="935" hits="0"/>
+						<line number="936" hits="0"/>
 						<line number="941" hits="1"/>
-						<line number="942" hits="1"/>
 						<line number="943" hits="1"/>
-						<line number="944" hits="0"/>
-						<line number="945" hits="0"/>
-						<line number="946" hits="1"/>
+						<line number="944" hits="1"/>
+						<line number="945" hits="1"/>
+						<line number="946" hits="0"/>
+						<line number="947" hits="0"/>
 						<line number="948" hits="1"/>
-						<line number="949" hits="1"/>
 						<line number="950" hits="1"/>
-						<line number="951" hits="0"/>
-						<line number="952" hits="0"/>
-						<line number="953" hits="1"/>
+						<line number="951" hits="1"/>
+						<line number="952" hits="1"/>
+						<line number="953" hits="0"/>
+						<line number="954" hits="0"/>
 						<line number="955" hits="1"/>
-						<line number="956" hits="0"/>
-						<line number="957" hits="0"/>
+						<line number="957" hits="1"/>
 						<line number="958" hits="0"/>
 						<line number="959" hits="0"/>
 						<line number="960" hits="0"/>
-						<line number="962" hits="1"/>
-						<line number="963" hits="1"/>
+						<line number="961" hits="0"/>
+						<line number="962" hits="0"/>
 						<line number="964" hits="1"/>
 						<line number="965" hits="1"/>
 						<line number="966" hits="1"/>
 						<line number="967" hits="1"/>
 						<line number="968" hits="1"/>
 						<line number="969" hits="1"/>
-						<line number="970" hits="0"/>
-						<line number="971" hits="0"/>
-						<line number="972" hits="1"/>
-						<line number="973" hits="1"/>
+						<line number="970" hits="1"/>
+						<line number="971" hits="1"/>
+						<line number="972" hits="0"/>
+						<line number="973" hits="0"/>
+						<line number="974" hits="1"/>
 						<line number="975" hits="1"/>
-						<line number="976" hits="1"/>
 						<line number="977" hits="1"/>
 						<line number="978" hits="1"/>
 						<line number="979" hits="1"/>
+						<line number="980" hits="1"/>
 						<line number="981" hits="1"/>
-						<line number="982" hits="1"/>
 						<line number="983" hits="1"/>
 						<line number="984" hits="1"/>
 						<line number="985" hits="1"/>
 						<line number="986" hits="1"/>
 						<line number="987" hits="1"/>
 						<line number="988" hits="1"/>
-						<line number="991" hits="1"/>
-						<line number="994" hits="1"/>
-						<line number="995" hits="1"/>
+						<line number="989" hits="1"/>
+						<line number="990" hits="1"/>
+						<line number="993" hits="1"/>
 						<line number="996" hits="1"/>
 						<line number="997" hits="1"/>
 						<line number="998" hits="1"/>
@@ -1269,10 +1268,10 @@
 						<line number="1021" hits="1"/>
 						<line number="1022" hits="1"/>
 						<line number="1023" hits="1"/>
+						<line number="1024" hits="1"/>
 						<line number="1025" hits="1"/>
-						<line number="1026" hits="1"/>
-						<line number="1029" hits="1"/>
-						<line number="1030" hits="1"/>
+						<line number="1027" hits="1"/>
+						<line number="1028" hits="1"/>
 						<line number="1031" hits="1"/>
 						<line number="1032" hits="1"/>
 						<line number="1033" hits="1"/>
@@ -1288,22 +1287,22 @@
 						<line number="1043" hits="1"/>
 						<line number="1044" hits="1"/>
 						<line number="1045" hits="1"/>
+						<line number="1046" hits="1"/>
 						<line number="1047" hits="1"/>
-						<line number="1048" hits="1"/>
 						<line number="1049" hits="1"/>
 						<line number="1050" hits="1"/>
 						<line number="1051" hits="1"/>
+						<line number="1052" hits="1"/>
 						<line number="1053" hits="1"/>
-						<line number="1054" hits="1"/>
 						<line number="1055" hits="1"/>
 						<line number="1056" hits="1"/>
 						<line number="1057" hits="1"/>
 						<line number="1058" hits="1"/>
+						<line number="1059" hits="1"/>
 						<line number="1060" hits="1"/>
-						<line number="1061" hits="1"/>
+						<line number="1062" hits="1"/>
 						<line number="1063" hits="1"/>
 						<line number="1065" hits="1"/>
-						<line number="1066" hits="1"/>
 						<line number="1067" hits="1"/>
 						<line number="1068" hits="1"/>
 						<line number="1069" hits="1"/>
@@ -1313,147 +1312,147 @@
 						<line number="1073" hits="1"/>
 						<line number="1074" hits="1"/>
 						<line number="1075" hits="1"/>
+						<line number="1076" hits="1"/>
 						<line number="1077" hits="1"/>
 						<line number="1079" hits="1"/>
-						<line number="1080" hits="1"/>
+						<line number="1081" hits="1"/>
 						<line number="1082" hits="1"/>
-						<line number="1085" hits="1"/>
-						<line number="1086" hits="1"/>
+						<line number="1084" hits="1"/>
 						<line number="1087" hits="1"/>
+						<line number="1088" hits="1"/>
 						<line number="1089" hits="1"/>
-						<line number="1090" hits="1"/>
 						<line number="1091" hits="1"/>
 						<line number="1092" hits="1"/>
 						<line number="1093" hits="1"/>
+						<line number="1094" hits="1"/>
 						<line number="1095" hits="1"/>
-						<line number="1096" hits="1"/>
 						<line number="1097" hits="1"/>
 						<line number="1098" hits="1"/>
 						<line number="1099" hits="1"/>
+						<line number="1100" hits="1"/>
 						<line number="1101" hits="1"/>
-						<line number="1102" hits="1"/>
 						<line number="1103" hits="1"/>
 						<line number="1104" hits="1"/>
 						<line number="1105" hits="1"/>
+						<line number="1106" hits="1"/>
 						<line number="1107" hits="1"/>
-						<line number="1108" hits="1"/>
 						<line number="1109" hits="1"/>
-						<line number="1124" hits="1"/>
-						<line number="1125" hits="1"/>
+						<line number="1110" hits="1"/>
+						<line number="1111" hits="1"/>
 						<line number="1126" hits="1"/>
+						<line number="1127" hits="1"/>
 						<line number="1128" hits="1"/>
-						<line number="1129" hits="1"/>
-						<line number="1135" hits="1"/>
-						<line number="1136" hits="1"/>
+						<line number="1130" hits="1"/>
+						<line number="1131" hits="1"/>
 						<line number="1137" hits="1"/>
 						<line number="1138" hits="1"/>
 						<line number="1139" hits="1"/>
-						<line number="1140" hits="0"/>
-						<line number="1141" hits="0"/>
-						<line number="1144" hits="0"/>
-						<line number="1145" hits="1"/>
-						<line number="1146" hits="1"/>
+						<line number="1140" hits="1"/>
+						<line number="1141" hits="1"/>
+						<line number="1142" hits="0"/>
+						<line number="1143" hits="0"/>
+						<line number="1146" hits="0"/>
 						<line number="1147" hits="1"/>
 						<line number="1148" hits="1"/>
 						<line number="1149" hits="1"/>
-						<line number="1153" hits="1"/>
-						<line number="1154" hits="1"/>
+						<line number="1150" hits="1"/>
+						<line number="1151" hits="1"/>
+						<line number="1155" hits="1"/>
 						<line number="1156" hits="1"/>
 						<line number="1158" hits="1"/>
 						<line number="1160" hits="1"/>
 						<line number="1162" hits="1"/>
-						<line number="1163" hits="1"/>
 						<line number="1164" hits="1"/>
 						<line number="1165" hits="1"/>
 						<line number="1166" hits="1"/>
+						<line number="1167" hits="1"/>
 						<line number="1168" hits="1"/>
-						<line number="1169" hits="1"/>
 						<line number="1170" hits="1"/>
+						<line number="1171" hits="1"/>
 						<line number="1172" hits="1"/>
-						<line number="1173" hits="1"/>
 						<line number="1174" hits="1"/>
 						<line number="1175" hits="1"/>
 						<line number="1176" hits="1"/>
 						<line number="1177" hits="1"/>
 						<line number="1178" hits="1"/>
-						<line number="1179" hits="0"/>
-						<line number="1180" hits="0"/>
+						<line number="1179" hits="1"/>
+						<line number="1180" hits="1"/>
 						<line number="1181" hits="0"/>
-						<line number="1187" hits="1"/>
-						<line number="1190" hits="1"/>
-						<line number="1191" hits="0"/>
-						<line number="1192" hits="0"/>
+						<line number="1182" hits="0"/>
+						<line number="1183" hits="0"/>
+						<line number="1189" hits="1"/>
+						<line number="1192" hits="1"/>
 						<line number="1193" hits="0"/>
-						<line number="1195" hits="1"/>
-						<line number="1196" hits="1"/>
+						<line number="1194" hits="0"/>
+						<line number="1195" hits="0"/>
 						<line number="1197" hits="1"/>
-						<line number="1198" hits="0"/>
+						<line number="1198" hits="1"/>
 						<line number="1199" hits="1"/>
-						<line number="1200" hits="1"/>
+						<line number="1200" hits="0"/>
 						<line number="1201" hits="1"/>
+						<line number="1202" hits="1"/>
 						<line number="1203" hits="1"/>
-						<line number="1204" hits="1"/>
 						<line number="1205" hits="1"/>
 						<line number="1206" hits="1"/>
 						<line number="1207" hits="1"/>
+						<line number="1208" hits="1"/>
 						<line number="1209" hits="1"/>
-						<line number="1210" hits="0"/>
-						<line number="1212" hits="1"/>
-						<line number="1213" hits="1"/>
+						<line number="1211" hits="1"/>
+						<line number="1212" hits="0"/>
 						<line number="1214" hits="1"/>
 						<line number="1215" hits="1"/>
+						<line number="1216" hits="1"/>
 						<line number="1217" hits="1"/>
-						<line number="1218" hits="1"/>
 						<line number="1219" hits="1"/>
 						<line number="1220" hits="1"/>
+						<line number="1221" hits="1"/>
 						<line number="1222" hits="1"/>
-						<line number="1223" hits="1"/>
-						<line number="1228" hits="1"/>
+						<line number="1224" hits="1"/>
+						<line number="1225" hits="1"/>
 						<line number="1230" hits="1"/>
 						<line number="1232" hits="1"/>
-						<line number="1233" hits="1"/>
 						<line number="1234" hits="1"/>
 						<line number="1235" hits="1"/>
+						<line number="1236" hits="1"/>
 						<line number="1237" hits="1"/>
-						<line number="1238" hits="1"/>
-						<line number="1243" hits="1"/>
+						<line number="1239" hits="1"/>
+						<line number="1240" hits="1"/>
 						<line number="1245" hits="1"/>
 						<line number="1247" hits="1"/>
-						<line number="1248" hits="1"/>
 						<line number="1249" hits="1"/>
+						<line number="1250" hits="1"/>
 						<line number="1251" hits="1"/>
-						<line number="1252" hits="1"/>
 						<line number="1253" hits="1"/>
 						<line number="1254" hits="1"/>
 						<line number="1255" hits="1"/>
 						<line number="1256" hits="1"/>
+						<line number="1257" hits="1"/>
 						<line number="1258" hits="1"/>
-						<line number="1259" hits="1"/>
 						<line number="1260" hits="1"/>
 						<line number="1261" hits="1"/>
 						<line number="1262" hits="1"/>
 						<line number="1263" hits="1"/>
 						<line number="1264" hits="1"/>
 						<line number="1265" hits="1"/>
+						<line number="1266" hits="1"/>
 						<line number="1267" hits="1"/>
-						<line number="1268" hits="1"/>
 						<line number="1269" hits="1"/>
 						<line number="1270" hits="1"/>
 						<line number="1271" hits="1"/>
+						<line number="1272" hits="1"/>
 						<line number="1273" hits="1"/>
-						<line number="1274" hits="1"/>
 						<line number="1275" hits="1"/>
 						<line number="1276" hits="1"/>
 						<line number="1277" hits="1"/>
 						<line number="1278" hits="1"/>
+						<line number="1279" hits="1"/>
 						<line number="1280" hits="1"/>
-						<line number="1281" hits="1"/>
 						<line number="1282" hits="1"/>
 						<line number="1283" hits="1"/>
 						<line number="1284" hits="1"/>
 						<line number="1285" hits="1"/>
-						<line number="1290" hits="1"/>
-						<line number="1291" hits="1"/>
+						<line number="1286" hits="1"/>
+						<line number="1287" hits="1"/>
 						<line number="1292" hits="1"/>
 						<line number="1293" hits="1"/>
 						<line number="1294" hits="1"/>
@@ -1466,20 +1465,20 @@
 						<line number="1301" hits="1"/>
 						<line number="1302" hits="1"/>
 						<line number="1303" hits="1"/>
+						<line number="1304" hits="1"/>
 						<line number="1305" hits="1"/>
-						<line number="1306" hits="1"/>
 						<line number="1307" hits="1"/>
 						<line number="1308" hits="1"/>
+						<line number="1309" hits="1"/>
 						<line number="1310" hits="1"/>
-						<line number="1311" hits="1"/>
 						<line number="1312" hits="1"/>
 						<line number="1313" hits="1"/>
 						<line number="1314" hits="1"/>
 						<line number="1315" hits="1"/>
 						<line number="1316" hits="1"/>
 						<line number="1317" hits="1"/>
+						<line number="1318" hits="1"/>
 						<line number="1319" hits="1"/>
-						<line number="1320" hits="1"/>
 						<line number="1321" hits="1"/>
 						<line number="1322" hits="1"/>
 						<line number="1323" hits="1"/>
@@ -1491,11 +1490,11 @@
 						<line number="1329" hits="1"/>
 						<line number="1330" hits="1"/>
 						<line number="1331" hits="1"/>
+						<line number="1332" hits="1"/>
 						<line number="1333" hits="1"/>
 						<line number="1335" hits="1"/>
-						<line number="1336" hits="1"/>
 						<line number="1337" hits="1"/>
-						<line number="1338" hits="0"/>
+						<line number="1338" hits="1"/>
 						<line number="1339" hits="1"/>
 						<line number="1340" hits="1"/>
 						<line number="1341" hits="1"/>
@@ -1503,72 +1502,72 @@
 						<line number="1343" hits="1"/>
 						<line number="1344" hits="1"/>
 						<line number="1345" hits="1"/>
-						<line number="1349" hits="1"/>
-						<line number="1355" hits="1"/>
-						<line number="1356" hits="1"/>
+						<line number="1346" hits="1"/>
+						<line number="1347" hits="1"/>
+						<line number="1351" hits="1"/>
 						<line number="1357" hits="1"/>
 						<line number="1358" hits="1"/>
 						<line number="1359" hits="1"/>
 						<line number="1360" hits="1"/>
+						<line number="1361" hits="1"/>
 						<line number="1362" hits="1"/>
-						<line number="1363" hits="1"/>
+						<line number="1364" hits="1"/>
 						<line number="1365" hits="1"/>
-						<line number="1366" hits="1"/>
 						<line number="1367" hits="1"/>
 						<line number="1368" hits="1"/>
 						<line number="1369" hits="1"/>
 						<line number="1370" hits="1"/>
 						<line number="1371" hits="1"/>
 						<line number="1372" hits="1"/>
+						<line number="1373" hits="1"/>
 						<line number="1374" hits="1"/>
-						<line number="1375" hits="1"/>
 						<line number="1376" hits="1"/>
 						<line number="1377" hits="1"/>
 						<line number="1378" hits="1"/>
 						<line number="1379" hits="1"/>
 						<line number="1380" hits="1"/>
-						<line number="1381" hits="0"/>
+						<line number="1381" hits="1"/>
+						<line number="1382" hits="1"/>
 						<line number="1383" hits="0"/>
-						<line number="1384" hits="1"/>
-						<line number="1385" hits="1"/>
+						<line number="1385" hits="0"/>
+						<line number="1386" hits="1"/>
 						<line number="1387" hits="1"/>
 						<line number="1389" hits="1"/>
 						<line number="1391" hits="1"/>
-						<line number="1392" hits="1"/>
 						<line number="1393" hits="1"/>
 						<line number="1394" hits="1"/>
 						<line number="1395" hits="1"/>
 						<line number="1396" hits="1"/>
-						<line number="1397" hits="0"/>
-						<line number="1399" hits="1"/>
-						<line number="1400" hits="1"/>
+						<line number="1397" hits="1"/>
+						<line number="1398" hits="1"/>
+						<line number="1399" hits="0"/>
 						<line number="1401" hits="1"/>
 						<line number="1402" hits="1"/>
 						<line number="1403" hits="1"/>
 						<line number="1404" hits="1"/>
-						<line number="1408" hits="1"/>
-						<line number="1409" hits="0"/>
+						<line number="1405" hits="1"/>
+						<line number="1406" hits="1"/>
+						<line number="1410" hits="1"/>
 						<line number="1411" hits="0"/>
-						<line number="1413" hits="1"/>
+						<line number="1413" hits="0"/>
 						<line number="1415" hits="1"/>
 						<line number="1417" hits="1"/>
-						<line number="1418" hits="1"/>
 						<line number="1419" hits="1"/>
 						<line number="1420" hits="1"/>
 						<line number="1421" hits="1"/>
 						<line number="1422" hits="1"/>
-						<line number="1423" hits="0"/>
-						<line number="1425" hits="1"/>
-						<line number="1426" hits="1"/>
+						<line number="1423" hits="1"/>
+						<line number="1424" hits="1"/>
+						<line number="1425" hits="0"/>
 						<line number="1427" hits="1"/>
 						<line number="1428" hits="1"/>
 						<line number="1429" hits="1"/>
 						<line number="1430" hits="1"/>
-						<line number="1434" hits="1"/>
-						<line number="1435" hits="0"/>
+						<line number="1431" hits="1"/>
+						<line number="1432" hits="1"/>
+						<line number="1436" hits="1"/>
 						<line number="1437" hits="0"/>
-						<line number="1439" hits="1"/>
-						<line number="1440" hits="1"/>
+						<line number="1439" hits="0"/>
 						<line number="1441" hits="1"/>
 						<line number="1442" hits="1"/>
 						<line number="1443" hits="1"/>
@@ -1580,8 +1579,8 @@
 						<line number="1449" hits="1"/>
 						<line number="1450" hits="1"/>
 						<line number="1451" hits="1"/>
+						<line number="1452" hits="1"/>
 						<line number="1453" hits="1"/>
-						<line number="1454" hits="1"/>
 						<line number="1455" hits="1"/>
 						<line number="1456" hits="1"/>
 						<line number="1457" hits="1"/>
@@ -1612,16 +1611,16 @@
 						<line number="1482" hits="1"/>
 						<line number="1483" hits="1"/>
 						<line number="1484" hits="1"/>
-						<line number="1490" hits="1"/>
-						<line number="1491" hits="1"/>
+						<line number="1485" hits="1"/>
+						<line number="1486" hits="1"/>
 						<line number="1492" hits="1"/>
 						<line number="1493" hits="1"/>
 						<line number="1494" hits="1"/>
 						<line number="1495" hits="1"/>
 						<line number="1496" hits="1"/>
 						<line number="1497" hits="1"/>
-						<line number="1503" hits="1"/>
-						<line number="1504" hits="1"/>
+						<line number="1498" hits="1"/>
+						<line number="1499" hits="1"/>
 						<line number="1505" hits="1"/>
 						<line number="1506" hits="1"/>
 						<line number="1507" hits="1"/>
@@ -1634,14 +1633,14 @@
 						<line number="1514" hits="1"/>
 						<line number="1515" hits="1"/>
 						<line number="1516" hits="1"/>
+						<line number="1517" hits="1"/>
 						<line number="1518" hits="1"/>
-						<line number="1519" hits="1"/>
 						<line number="1520" hits="1"/>
 						<line number="1521" hits="1"/>
+						<line number="1522" hits="1"/>
 						<line number="1523" hits="1"/>
-						<line number="1524" hits="1"/>
-						<line number="1528" hits="1"/>
-						<line number="1529" hits="1"/>
+						<line number="1525" hits="1"/>
+						<line number="1526" hits="1"/>
 						<line number="1530" hits="1"/>
 						<line number="1531" hits="1"/>
 						<line number="1532" hits="1"/>
@@ -1653,8 +1652,8 @@
 						<line number="1538" hits="1"/>
 						<line number="1539" hits="1"/>
 						<line number="1540" hits="1"/>
+						<line number="1541" hits="1"/>
 						<line number="1542" hits="1"/>
-						<line number="1543" hits="1"/>
 						<line number="1544" hits="1"/>
 						<line number="1545" hits="1"/>
 						<line number="1546" hits="1"/>
@@ -1672,41 +1671,41 @@
 						<line number="1558" hits="1"/>
 						<line number="1559" hits="1"/>
 						<line number="1560" hits="1"/>
+						<line number="1561" hits="1"/>
 						<line number="1562" hits="1"/>
-						<line number="1563" hits="1"/>
 						<line number="1564" hits="1"/>
 						<line number="1565" hits="1"/>
 						<line number="1566" hits="1"/>
 						<line number="1567" hits="1"/>
 						<line number="1568" hits="1"/>
+						<line number="1569" hits="1"/>
 						<line number="1570" hits="1"/>
-						<line number="1571" hits="1"/>
 						<line number="1572" hits="1"/>
 						<line number="1573" hits="1"/>
+						<line number="1574" hits="1"/>
 						<line number="1575" hits="1"/>
-						<line number="1576" hits="1"/>
 						<line number="1577" hits="1"/>
 						<line number="1578" hits="1"/>
+						<line number="1579" hits="1"/>
 						<line number="1580" hits="1"/>
-						<line number="1581" hits="1"/>
 						<line number="1582" hits="1"/>
 						<line number="1583" hits="1"/>
 						<line number="1584" hits="1"/>
 						<line number="1585" hits="1"/>
 						<line number="1586" hits="1"/>
+						<line number="1587" hits="1"/>
 						<line number="1588" hits="1"/>
-						<line number="1591" hits="1"/>
-						<line number="1592" hits="1"/>
+						<line number="1590" hits="1"/>
 						<line number="1593" hits="1"/>
 						<line number="1594" hits="1"/>
 						<line number="1595" hits="1"/>
 						<line number="1596" hits="1"/>
 						<line number="1597" hits="1"/>
 						<line number="1598" hits="1"/>
+						<line number="1599" hits="1"/>
 						<line number="1600" hits="1"/>
-						<line number="1601" hits="1"/>
-						<line number="1607" hits="1"/>
-						<line number="1608" hits="1"/>
+						<line number="1602" hits="1"/>
+						<line number="1603" hits="1"/>
 						<line number="1609" hits="1"/>
 						<line number="1610" hits="1"/>
 						<line number="1611" hits="1"/>
@@ -1722,25 +1721,25 @@
 						<line number="1621" hits="1"/>
 						<line number="1622" hits="1"/>
 						<line number="1623" hits="1"/>
+						<line number="1624" hits="1"/>
 						<line number="1625" hits="1"/>
-						<line number="1628" hits="1"/>
-						<line number="1629" hits="1"/>
+						<line number="1627" hits="1"/>
 						<line number="1630" hits="1"/>
+						<line number="1631" hits="1"/>
 						<line number="1632" hits="1"/>
-						<line number="1633" hits="1"/>
-						<line number="1636" hits="1"/>
+						<line number="1634" hits="1"/>
+						<line number="1635" hits="1"/>
 						<line number="1638" hits="1"/>
-						<line number="1639" hits="1"/>
+						<line number="1640" hits="1"/>
 						<line number="1641" hits="1"/>
-						<line number="1642" hits="1"/>
+						<line number="1643" hits="1"/>
 						<line number="1644" hits="1"/>
-						<line number="1645" hits="0"/>
-						<line number="1646" hits="0"/>
+						<line number="1646" hits="1"/>
 						<line number="1647" hits="0"/>
 						<line number="1648" hits="0"/>
 						<line number="1649" hits="0"/>
-						<line number="1651" hits="1"/>
-						<line number="1652" hits="1"/>
+						<line number="1650" hits="0"/>
+						<line number="1651" hits="0"/>
 						<line number="1653" hits="1"/>
 						<line number="1654" hits="1"/>
 						<line number="1655" hits="1"/>
@@ -1752,59 +1751,59 @@
 						<line number="1661" hits="1"/>
 						<line number="1662" hits="1"/>
 						<line number="1663" hits="1"/>
+						<line number="1664" hits="1"/>
 						<line number="1665" hits="1"/>
-						<line number="1666" hits="1"/>
+						<line number="1667" hits="1"/>
 						<line number="1668" hits="1"/>
-						<line number="1669" hits="1"/>
-						<line number="1673" hits="1"/>
-						<line number="1674" hits="1"/>
+						<line number="1670" hits="1"/>
+						<line number="1671" hits="1"/>
+						<line number="1675" hits="1"/>
 						<line number="1676" hits="1"/>
-						<line number="1677" hits="1"/>
 						<line number="1678" hits="1"/>
 						<line number="1679" hits="1"/>
+						<line number="1680" hits="1"/>
 						<line number="1681" hits="1"/>
-						<line number="1682" hits="1"/>
+						<line number="1683" hits="1"/>
 						<line number="1684" hits="1"/>
-						<line number="1685" hits="1"/>
 						<line number="1686" hits="1"/>
-						<line number="1691" hits="1"/>
+						<line number="1687" hits="1"/>
+						<line number="1688" hits="1"/>
 						<line number="1693" hits="1"/>
-						<line number="1694" hits="1"/>
+						<line number="1695" hits="1"/>
 						<line number="1696" hits="1"/>
-						<line number="1697" hits="1"/>
 						<line number="1698" hits="1"/>
 						<line number="1699" hits="1"/>
 						<line number="1700" hits="1"/>
+						<line number="1701" hits="1"/>
 						<line number="1702" hits="1"/>
-						<line number="1703" hits="1"/>
+						<line number="1704" hits="1"/>
 						<line number="1705" hits="1"/>
-						<line number="1706" hits="1"/>
+						<line number="1707" hits="1"/>
 						<line number="1708" hits="1"/>
-						<line number="1709" hits="0"/>
-						<line number="1711" hits="1"/>
+						<line number="1710" hits="1"/>
+						<line number="1711" hits="0"/>
 						<line number="1713" hits="1"/>
-						<line number="1714" hits="1"/>
+						<line number="1715" hits="1"/>
 						<line number="1716" hits="1"/>
-						<line number="1717" hits="1"/>
+						<line number="1718" hits="1"/>
 						<line number="1719" hits="1"/>
 						<line number="1721" hits="1"/>
-						<line number="1722" hits="1"/>
+						<line number="1723" hits="1"/>
 						<line number="1724" hits="1"/>
-						<line number="1725" hits="1"/>
+						<line number="1726" hits="1"/>
 						<line number="1727" hits="1"/>
 						<line number="1729" hits="1"/>
 						<line number="1731" hits="1"/>
 						<line number="1733" hits="1"/>
 						<line number="1735" hits="1"/>
-						<line number="1736" hits="0"/>
-						<line number="1737" hits="0"/>
-						<line number="1739" hits="1"/>
-						<line number="1752" hits="1"/>
-						<line number="1755" hits="1"/>
-						<line number="1765" hits="1"/>
-						<line number="1773" hits="1"/>
+						<line number="1737" hits="1"/>
+						<line number="1738" hits="0"/>
+						<line number="1739" hits="0"/>
+						<line number="1741" hits="1"/>
+						<line number="1754" hits="1"/>
+						<line number="1757" hits="1"/>
+						<line number="1767" hits="1"/>
 						<line number="1775" hits="1"/>
-						<line number="1776" hits="1"/>
 						<line number="1777" hits="1"/>
 						<line number="1778" hits="1"/>
 						<line number="1779" hits="1"/>
@@ -1820,39 +1819,37 @@
 						<line number="1789" hits="1"/>
 						<line number="1790" hits="1"/>
 						<line number="1791" hits="1"/>
+						<line number="1792" hits="1"/>
 						<line number="1793" hits="1"/>
-						<line number="1794" hits="1"/>
+						<line number="1795" hits="1"/>
 						<line number="1796" hits="1"/>
-						<line number="1797" hits="1"/>
 						<line number="1798" hits="1"/>
 						<line number="1799" hits="1"/>
 						<line number="1800" hits="1"/>
 						<line number="1801" hits="1"/>
 						<line number="1802" hits="1"/>
+						<line number="1803" hits="1"/>
 						<line number="1804" hits="1"/>
-						<line number="1805" hits="1"/>
 						<line number="1806" hits="1"/>
 						<line number="1807" hits="1"/>
 						<line number="1808" hits="1"/>
+						<line number="1809" hits="1"/>
 						<line number="1810" hits="1"/>
-						<line number="1811" hits="1"/>
+						<line number="1812" hits="1"/>
 						<line number="1813" hits="1"/>
-						<line number="1814" hits="1"/>
 						<line number="1815" hits="1"/>
 						<line number="1816" hits="1"/>
 						<line number="1817" hits="1"/>
 						<line number="1818" hits="1"/>
 						<line number="1819" hits="1"/>
+						<line number="1820" hits="1"/>
 						<line number="1821" hits="1"/>
-						<line number="1822" hits="1"/>
 						<line number="1823" hits="1"/>
 						<line number="1824" hits="1"/>
-						<line number="1825" hits="1"/>
 						<line number="1826" hits="1"/>
 						<line number="1827" hits="1"/>
 						<line number="1829" hits="1"/>
 						<line number="1830" hits="1"/>
-						<line number="1831" hits="1"/>
 						<line number="1832" hits="1"/>
 						<line number="1833" hits="1"/>
 						<line number="1834" hits="1"/>
@@ -1865,182 +1862,182 @@
 						<line number="1841" hits="1"/>
 						<line number="1842" hits="1"/>
 						<line number="1843" hits="1"/>
+						<line number="1844" hits="1"/>
 						<line number="1845" hits="1"/>
-						<line number="1846" hits="0"/>
-						<line number="1847" hits="0"/>
-						<line number="1848" hits="0"/>
-						<line number="1850" hits="1"/>
+						<line number="1846" hits="1"/>
+						<line number="1848" hits="1"/>
+						<line number="1849" hits="0"/>
+						<line number="1850" hits="0"/>
 						<line number="1851" hits="0"/>
-						<line number="1852" hits="0"/>
-						<line number="1853" hits="0"/>
-						<line number="1855" hits="1"/>
-						<line number="1856" hits="1"/>
-						<line number="1857" hits="1"/>
+						<line number="1853" hits="1"/>
+						<line number="1854" hits="0"/>
+						<line number="1855" hits="0"/>
+						<line number="1856" hits="0"/>
 						<line number="1858" hits="1"/>
-						<line number="1863" hits="1"/>
-						<line number="1864" hits="1"/>
+						<line number="1859" hits="1"/>
+						<line number="1860" hits="1"/>
+						<line number="1861" hits="1"/>
 						<line number="1866" hits="1"/>
 						<line number="1867" hits="1"/>
-						<line number="1868" hits="1"/>
 						<line number="1869" hits="1"/>
-						<line number="1874" hits="1"/>
-						<line number="1875" hits="1"/>
+						<line number="1870" hits="1"/>
+						<line number="1871" hits="1"/>
+						<line number="1872" hits="1"/>
 						<line number="1877" hits="1"/>
 						<line number="1878" hits="1"/>
-						<line number="1879" hits="1"/>
 						<line number="1880" hits="1"/>
 						<line number="1881" hits="1"/>
 						<line number="1882" hits="1"/>
-						<line number="1888" hits="1"/>
-						<line number="1889" hits="1"/>
-						<line number="1894" hits="1"/>
-						<line number="1895" hits="1"/>
+						<line number="1883" hits="1"/>
+						<line number="1884" hits="1"/>
+						<line number="1885" hits="1"/>
+						<line number="1891" hits="1"/>
+						<line number="1892" hits="1"/>
 						<line number="1897" hits="1"/>
 						<line number="1898" hits="1"/>
-						<line number="1899" hits="1"/>
 						<line number="1900" hits="1"/>
+						<line number="1901" hits="1"/>
 						<line number="1902" hits="1"/>
 						<line number="1903" hits="1"/>
-						<line number="1904" hits="1"/>
 						<line number="1905" hits="1"/>
-						<line number="1910" hits="1"/>
-						<line number="1911" hits="1"/>
-						<line number="1916" hits="1"/>
-						<line number="1917" hits="1"/>
+						<line number="1906" hits="1"/>
+						<line number="1907" hits="1"/>
+						<line number="1908" hits="1"/>
+						<line number="1913" hits="1"/>
+						<line number="1914" hits="1"/>
 						<line number="1919" hits="1"/>
 						<line number="1920" hits="1"/>
-						<line number="1921" hits="1"/>
 						<line number="1922" hits="1"/>
-						<line number="1927" hits="1"/>
-						<line number="1931" hits="1"/>
-						<line number="1936" hits="1"/>
-						<line number="1937" hits="0"/>
-						<line number="1942" hits="1"/>
-						<line number="1943" hits="1"/>
-						<line number="1944" hits="1"/>
-						<line number="1945" hits="0"/>
-						<line number="1946" hits="0"/>
-						<line number="1951" hits="1"/>
-						<line number="1952" hits="1"/>
-						<line number="1957" hits="1"/>
-						<line number="1958" hits="1"/>
-						<line number="1959" hits="1"/>
-						<line number="1960" hits="0"/>
-						<line number="1961" hits="0"/>
-						<line number="1966" hits="1"/>
-						<line number="1967" hits="1"/>
-						<line number="1973" hits="1"/>
-						<line number="1974" hits="1"/>
-						<line number="1980" hits="1"/>
-						<line number="1981" hits="1"/>
+						<line number="1923" hits="1"/>
+						<line number="1924" hits="1"/>
+						<line number="1925" hits="1"/>
+						<line number="1930" hits="1"/>
+						<line number="1934" hits="1"/>
+						<line number="1939" hits="1"/>
+						<line number="1940" hits="0"/>
+						<line number="1945" hits="1"/>
+						<line number="1946" hits="1"/>
+						<line number="1947" hits="1"/>
+						<line number="1948" hits="0"/>
+						<line number="1949" hits="0"/>
+						<line number="1954" hits="1"/>
+						<line number="1955" hits="1"/>
+						<line number="1960" hits="1"/>
+						<line number="1961" hits="1"/>
+						<line number="1962" hits="1"/>
+						<line number="1963" hits="0"/>
+						<line number="1964" hits="0"/>
+						<line number="1969" hits="1"/>
+						<line number="1970" hits="1"/>
+						<line number="1976" hits="1"/>
+						<line number="1977" hits="1"/>
 						<line number="1983" hits="1"/>
 						<line number="1984" hits="1"/>
 						<line number="1986" hits="1"/>
-						<line number="1993" hits="1"/>
-						<line number="1995" hits="1"/>
+						<line number="1987" hits="1"/>
+						<line number="1989" hits="1"/>
 						<line number="1996" hits="1"/>
-						<line number="1997" hits="1"/>
 						<line number="1998" hits="1"/>
 						<line number="1999" hits="1"/>
-						<line number="2004" hits="1"/>
-						<line number="2005" hits="1"/>
+						<line number="2000" hits="1"/>
+						<line number="2001" hits="1"/>
+						<line number="2002" hits="1"/>
+						<line number="2007" hits="1"/>
 						<line number="2008" hits="1"/>
-						<line number="2013" hits="1"/>
-						<line number="2014" hits="1"/>
-						<line number="2015" hits="1"/>
+						<line number="2011" hits="1"/>
 						<line number="2016" hits="1"/>
+						<line number="2017" hits="1"/>
 						<line number="2018" hits="1"/>
 						<line number="2019" hits="1"/>
-						<line number="2020" hits="1"/>
 						<line number="2021" hits="1"/>
+						<line number="2022" hits="1"/>
 						<line number="2023" hits="1"/>
 						<line number="2024" hits="1"/>
+						<line number="2026" hits="1"/>
 						<line number="2027" hits="1"/>
-						<line number="2028" hits="1"/>
-						<line number="2029" hits="1"/>
-						<line number="2034" hits="1"/>
-						<line number="2035" hits="1"/>
-						<line number="2036" hits="1"/>
-						<line number="2042" hits="1"/>
-						<line number="2043" hits="1"/>
-						<line number="2049" hits="1"/>
-						<line number="2050" hits="1"/>
+						<line number="2030" hits="1"/>
+						<line number="2031" hits="1"/>
+						<line number="2032" hits="1"/>
+						<line number="2037" hits="1"/>
+						<line number="2038" hits="1"/>
+						<line number="2039" hits="1"/>
+						<line number="2045" hits="1"/>
+						<line number="2046" hits="1"/>
 						<line number="2052" hits="1"/>
 						<line number="2053" hits="1"/>
+						<line number="2055" hits="1"/>
 						<line number="2056" hits="1"/>
-						<line number="2065" hits="1"/>
-						<line number="2067" hits="1"/>
+						<line number="2059" hits="1"/>
 						<line number="2068" hits="1"/>
+						<line number="2070" hits="1"/>
 						<line number="2071" hits="1"/>
-						<line number="2072" hits="1"/>
-						<line number="2073" hits="1"/>
-						<line number="2079" hits="1"/>
-						<line number="2080" hits="1"/>
-						<line number="2086" hits="1"/>
-						<line number="2087" hits="1"/>
-						<line number="2088" hits="1"/>
-						<line number="2094" hits="1"/>
-						<line number="2095" hits="1"/>
-						<line number="2101" hits="1"/>
-						<line number="2102" hits="1"/>
+						<line number="2074" hits="1"/>
+						<line number="2075" hits="1"/>
+						<line number="2076" hits="1"/>
+						<line number="2082" hits="1"/>
+						<line number="2083" hits="1"/>
+						<line number="2089" hits="1"/>
+						<line number="2090" hits="1"/>
+						<line number="2091" hits="1"/>
+						<line number="2097" hits="1"/>
+						<line number="2098" hits="1"/>
 						<line number="2104" hits="1"/>
 						<line number="2105" hits="1"/>
-						<line number="2106" hits="1"/>
 						<line number="2107" hits="1"/>
 						<line number="2108" hits="1"/>
+						<line number="2109" hits="1"/>
 						<line number="2110" hits="1"/>
 						<line number="2111" hits="1"/>
-						<line number="2112" hits="1"/>
 						<line number="2113" hits="1"/>
 						<line number="2114" hits="1"/>
+						<line number="2115" hits="1"/>
+						<line number="2116" hits="1"/>
 						<line number="2117" hits="1"/>
 						<line number="2120" hits="1"/>
-						<line number="2121" hits="1"/>
 						<line number="2123" hits="1"/>
 						<line number="2124" hits="1"/>
-						<line number="2125" hits="1"/>
 						<line number="2126" hits="1"/>
 						<line number="2127" hits="1"/>
 						<line number="2128" hits="1"/>
 						<line number="2129" hits="1"/>
+						<line number="2130" hits="1"/>
 						<line number="2131" hits="1"/>
 						<line number="2132" hits="1"/>
-						<line number="2133" hits="1"/>
 						<line number="2134" hits="1"/>
 						<line number="2135" hits="1"/>
 						<line number="2136" hits="1"/>
 						<line number="2137" hits="1"/>
 						<line number="2138" hits="1"/>
 						<line number="2139" hits="1"/>
+						<line number="2140" hits="1"/>
 						<line number="2141" hits="1"/>
 						<line number="2142" hits="1"/>
-						<line number="2143" hits="1"/>
 						<line number="2144" hits="1"/>
+						<line number="2145" hits="1"/>
 						<line number="2146" hits="1"/>
 						<line number="2147" hits="1"/>
-						<line number="2148" hits="1"/>
+						<line number="2149" hits="1"/>
 						<line number="2150" hits="1"/>
 						<line number="2151" hits="1"/>
-						<line number="2152" hits="1"/>
 						<line number="2153" hits="1"/>
 						<line number="2154" hits="1"/>
+						<line number="2155" hits="1"/>
 						<line number="2156" hits="1"/>
 						<line number="2157" hits="1"/>
-						<line number="2158" hits="1"/>
 						<line number="2159" hits="1"/>
+						<line number="2160" hits="1"/>
 						<line number="2161" hits="1"/>
 						<line number="2162" hits="1"/>
-						<line number="2163" hits="1"/>
 						<line number="2164" hits="1"/>
+						<line number="2165" hits="1"/>
 						<line number="2166" hits="1"/>
 						<line number="2167" hits="1"/>
-						<line number="2168" hits="1"/>
 						<line number="2169" hits="1"/>
+						<line number="2170" hits="1"/>
 						<line number="2171" hits="1"/>
 						<line number="2172" hits="1"/>
+						<line number="2174" hits="1"/>
 						<line number="2175" hits="1"/>
-						<line number="2176" hits="1"/>
-						<line number="2177" hits="1"/>
 						<line number="2178" hits="1"/>
 						<line number="2179" hits="1"/>
 						<line number="2180" hits="1"/>
@@ -2051,39 +2048,39 @@
 						<line number="2185" hits="1"/>
 						<line number="2186" hits="1"/>
 						<line number="2187" hits="1"/>
+						<line number="2188" hits="1"/>
 						<line number="2189" hits="1"/>
 						<line number="2190" hits="1"/>
-						<line number="2191" hits="1"/>
 						<line number="2192" hits="1"/>
 						<line number="2193" hits="1"/>
+						<line number="2194" hits="1"/>
 						<line number="2195" hits="1"/>
-						<line number="2197" hits="1"/>
+						<line number="2196" hits="1"/>
 						<line number="2198" hits="1"/>
-						<line number="2199" hits="0"/>
+						<line number="2200" hits="1"/>
 						<line number="2201" hits="1"/>
-						<line number="2202" hits="1"/>
+						<line number="2202" hits="0"/>
 						<line number="2204" hits="1"/>
 						<line number="2205" hits="1"/>
-						<line number="2206" hits="1"/>
 						<line number="2207" hits="1"/>
 						<line number="2208" hits="1"/>
 						<line number="2209" hits="1"/>
 						<line number="2210" hits="1"/>
 						<line number="2211" hits="1"/>
+						<line number="2212" hits="1"/>
 						<line number="2213" hits="1"/>
 						<line number="2214" hits="1"/>
-						<line number="2215" hits="1"/>
 						<line number="2216" hits="1"/>
 						<line number="2217" hits="1"/>
 						<line number="2218" hits="1"/>
 						<line number="2219" hits="1"/>
-						<line number="2220" hits="0"/>
-						<line number="2222" hits="0"/>
-						<line number="2223" hits="1"/>
-						<line number="2224" hits="1"/>
+						<line number="2220" hits="1"/>
+						<line number="2221" hits="1"/>
+						<line number="2222" hits="1"/>
+						<line number="2223" hits="0"/>
+						<line number="2225" hits="0"/>
 						<line number="2226" hits="1"/>
 						<line number="2227" hits="1"/>
-						<line number="2228" hits="1"/>
 						<line number="2229" hits="1"/>
 						<line number="2230" hits="1"/>
 						<line number="2231" hits="1"/>
@@ -2092,14 +2089,14 @@
 						<line number="2234" hits="1"/>
 						<line number="2235" hits="1"/>
 						<line number="2236" hits="1"/>
+						<line number="2237" hits="1"/>
 						<line number="2238" hits="1"/>
 						<line number="2239" hits="1"/>
 						<line number="2241" hits="1"/>
 						<line number="2242" hits="1"/>
-						<line number="2243" hits="1"/>
+						<line number="2244" hits="1"/>
 						<line number="2245" hits="1"/>
 						<line number="2246" hits="1"/>
-						<line number="2247" hits="1"/>
 						<line number="2248" hits="1"/>
 						<line number="2249" hits="1"/>
 						<line number="2250" hits="1"/>
@@ -2127,15 +2124,15 @@
 						<line number="2272" hits="1"/>
 						<line number="2273" hits="1"/>
 						<line number="2274" hits="1"/>
-						<line number="2275" hits="0"/>
-						<line number="2276" hits="0"/>
+						<line number="2275" hits="1"/>
+						<line number="2276" hits="1"/>
 						<line number="2277" hits="1"/>
-						<line number="2278" hits="1"/>
-						<line number="2279" hits="1"/>
+						<line number="2278" hits="0"/>
+						<line number="2279" hits="0"/>
 						<line number="2280" hits="1"/>
+						<line number="2281" hits="1"/>
 						<line number="2282" hits="1"/>
 						<line number="2283" hits="1"/>
-						<line number="2284" hits="1"/>
 						<line number="2285" hits="1"/>
 						<line number="2286" hits="1"/>
 						<line number="2287" hits="1"/>
@@ -2153,14 +2150,14 @@
 						<line number="2299" hits="1"/>
 						<line number="2300" hits="1"/>
 						<line number="2301" hits="1"/>
+						<line number="2302" hits="1"/>
 						<line number="2303" hits="1"/>
 						<line number="2304" hits="1"/>
-						<line number="2305" hits="1"/>
 						<line number="2306" hits="1"/>
+						<line number="2307" hits="1"/>
+						<line number="2308" hits="1"/>
 						<line number="2309" hits="1"/>
-						<line number="2311" hits="1"/>
 						<line number="2312" hits="1"/>
-						<line number="2313" hits="1"/>
 						<line number="2314" hits="1"/>
 						<line number="2315" hits="1"/>
 						<line number="2316" hits="1"/>
@@ -2171,6 +2168,7 @@
 						<line number="2321" hits="1"/>
 						<line number="2322" hits="1"/>
 						<line number="2323" hits="1"/>
+						<line number="2324" hits="1"/>
 						<line number="2325" hits="1"/>
 						<line number="2326" hits="1"/>
 						<line number="2328" hits="1"/>
@@ -2191,7 +2189,7 @@
 						<line number="2350" hits="1"/>
 						<line number="2352" hits="1"/>
 						<line number="2353" hits="1"/>
-						<line number="2354" hits="1"/>
+						<line number="2355" hits="1"/>
 						<line number="2356" hits="1"/>
 						<line number="2357" hits="1"/>
 						<line number="2359" hits="1"/>
@@ -2200,130 +2198,129 @@
 						<line number="2363" hits="1"/>
 						<line number="2365" hits="1"/>
 						<line number="2366" hits="1"/>
-						<line number="2367" hits="0"/>
+						<line number="2368" hits="1"/>
 						<line number="2369" hits="1"/>
-						<line number="2370" hits="1"/>
-						<line number="2371" hits="1"/>
+						<line number="2370" hits="0"/>
+						<line number="2372" hits="1"/>
 						<line number="2373" hits="1"/>
 						<line number="2374" hits="1"/>
 						<line number="2376" hits="1"/>
 						<line number="2377" hits="1"/>
-						<line number="2378" hits="1"/>
 						<line number="2379" hits="1"/>
 						<line number="2380" hits="1"/>
-						<line number="2381" hits="0"/>
-						<line number="2382" hits="0"/>
-						<line number="2383" hits="0"/>
+						<line number="2381" hits="1"/>
+						<line number="2382" hits="1"/>
+						<line number="2383" hits="1"/>
 						<line number="2384" hits="0"/>
+						<line number="2385" hits="0"/>
 						<line number="2386" hits="0"/>
-						<line number="2388" hits="1"/>
-						<line number="2389" hits="1"/>
+						<line number="2387" hits="0"/>
+						<line number="2389" hits="0"/>
 						<line number="2391" hits="1"/>
 						<line number="2392" hits="1"/>
 						<line number="2394" hits="1"/>
 						<line number="2395" hits="1"/>
 						<line number="2397" hits="1"/>
 						<line number="2398" hits="1"/>
-						<line number="2399" hits="1"/>
 						<line number="2400" hits="1"/>
+						<line number="2401" hits="1"/>
 						<line number="2402" hits="1"/>
 						<line number="2403" hits="1"/>
-						<line number="2404" hits="1"/>
 						<line number="2405" hits="1"/>
+						<line number="2406" hits="1"/>
 						<line number="2407" hits="1"/>
 						<line number="2408" hits="1"/>
-						<line number="2409" hits="0"/>
-						<line number="2415" hits="1"/>
-						<line number="2416" hits="0"/>
-						<line number="2422" hits="1"/>
-						<line number="2425" hits="0"/>
-						<line number="2431" hits="1"/>
-						<line number="2438" hits="0"/>
-						<line number="2444" hits="1"/>
-						<line number="2445" hits="0"/>
-						<line number="2450" hits="1"/>
-						<line number="2451" hits="0"/>
-						<line number="2456" hits="1"/>
-						<line number="2457" hits="0"/>
-						<line number="2462" hits="1"/>
-						<line number="2463" hits="0"/>
-						<line number="2469" hits="1"/>
-						<line number="2470" hits="0"/>
-						<line number="2475" hits="1"/>
-						<line number="2476" hits="0"/>
-						<line number="2481" hits="1"/>
-						<line number="2482" hits="0"/>
-						<line number="2487" hits="1"/>
-						<line number="2488" hits="0"/>
-						<line number="2494" hits="1"/>
-						<line number="2495" hits="0"/>
-						<line number="2501" hits="1"/>
-						<line number="2502" hits="0"/>
-						<line number="2508" hits="1"/>
-						<line number="2509" hits="1"/>
-						<line number="2513" hits="1"/>
-						<line number="2522" hits="1"/>
-						<line number="2526" hits="1"/>
-						<line number="2527" hits="1"/>
-						<line number="2528" hits="1"/>
+						<line number="2410" hits="1"/>
+						<line number="2411" hits="1"/>
+						<line number="2412" hits="0"/>
+						<line number="2418" hits="1"/>
+						<line number="2419" hits="0"/>
+						<line number="2425" hits="1"/>
+						<line number="2428" hits="0"/>
+						<line number="2434" hits="1"/>
+						<line number="2441" hits="0"/>
+						<line number="2447" hits="1"/>
+						<line number="2448" hits="0"/>
+						<line number="2453" hits="1"/>
+						<line number="2454" hits="0"/>
+						<line number="2459" hits="1"/>
+						<line number="2460" hits="0"/>
+						<line number="2465" hits="1"/>
+						<line number="2466" hits="0"/>
+						<line number="2472" hits="1"/>
+						<line number="2473" hits="0"/>
+						<line number="2478" hits="1"/>
+						<line number="2479" hits="0"/>
+						<line number="2484" hits="1"/>
+						<line number="2485" hits="0"/>
+						<line number="2490" hits="1"/>
+						<line number="2491" hits="0"/>
+						<line number="2497" hits="1"/>
+						<line number="2498" hits="0"/>
+						<line number="2504" hits="1"/>
+						<line number="2505" hits="0"/>
+						<line number="2511" hits="1"/>
+						<line number="2512" hits="1"/>
+						<line number="2516" hits="1"/>
+						<line number="2525" hits="1"/>
+						<line number="2529" hits="1"/>
 						<line number="2530" hits="1"/>
 						<line number="2531" hits="1"/>
 						<line number="2533" hits="1"/>
-						<line number="2535" hits="1"/>
+						<line number="2534" hits="1"/>
 						<line number="2536" hits="1"/>
 						<line number="2538" hits="1"/>
 						<line number="2539" hits="1"/>
 						<line number="2541" hits="1"/>
-						<line number="2543" hits="1"/>
+						<line number="2542" hits="1"/>
 						<line number="2544" hits="1"/>
 						<line number="2546" hits="1"/>
 						<line number="2547" hits="1"/>
 						<line number="2549" hits="1"/>
-						<line number="2551" hits="1"/>
+						<line number="2550" hits="1"/>
 						<line number="2552" hits="1"/>
 						<line number="2554" hits="1"/>
 						<line number="2555" hits="1"/>
 						<line number="2557" hits="1"/>
-						<line number="2559" hits="1"/>
+						<line number="2558" hits="1"/>
 						<line number="2560" hits="1"/>
-						<line number="2561" hits="1"/>
 						<line number="2562" hits="1"/>
+						<line number="2563" hits="1"/>
 						<line number="2564" hits="1"/>
 						<line number="2565" hits="1"/>
-						<line number="2566" hits="1"/>
 						<line number="2567" hits="1"/>
+						<line number="2568" hits="1"/>
 						<line number="2569" hits="1"/>
-						<line number="2571" hits="1"/>
-						<line number="2582" hits="1"/>
-						<line number="2583" hits="1"/>
+						<line number="2570" hits="1"/>
+						<line number="2572" hits="1"/>
+						<line number="2574" hits="1"/>
 						<line number="2585" hits="1"/>
 						<line number="2586" hits="1"/>
-						<line number="2587" hits="1"/>
-						<line number="2599" hits="1"/>
-						<line number="2603" hits="1"/>
-						<line number="2604" hits="1"/>
-						<line number="2605" hits="1"/>
-						<line number="2617" hits="1"/>
-						<line number="2621" hits="1"/>
-						<line number="2623" hits="1"/>
-						<line number="2624" hits="0"/>
-						<line number="2625" hits="1"/>
-						<line number="2626" hits="0"/>
-						<line number="2627" hits="1"/>
-						<line number="2628" hits="0"/>
-						<line number="2629" hits="1"/>
-						<line number="2630" hits="0"/>
-						<line number="2631" hits="1"/>
+						<line number="2588" hits="1"/>
+						<line number="2589" hits="1"/>
+						<line number="2590" hits="1"/>
+						<line number="2602" hits="1"/>
+						<line number="2606" hits="1"/>
+						<line number="2607" hits="1"/>
+						<line number="2608" hits="1"/>
+						<line number="2620" hits="1"/>
+						<line number="2624" hits="1"/>
+						<line number="2626" hits="1"/>
+						<line number="2627" hits="0"/>
+						<line number="2628" hits="1"/>
+						<line number="2629" hits="0"/>
+						<line number="2630" hits="1"/>
+						<line number="2631" hits="0"/>
 						<line number="2632" hits="1"/>
-						<line number="2633" hits="1"/>
+						<line number="2633" hits="0"/>
 						<line number="2634" hits="1"/>
 						<line number="2635" hits="1"/>
 						<line number="2636" hits="1"/>
 						<line number="2637" hits="1"/>
 						<line number="2638" hits="1"/>
+						<line number="2639" hits="1"/>
 						<line number="2640" hits="1"/>
 						<line number="2641" hits="1"/>
-						<line number="2642" hits="1"/>
 						<line number="2643" hits="1"/>
 						<line number="2644" hits="1"/>
 						<line number="2645" hits="1"/>
@@ -2335,66 +2332,66 @@
 						<line number="2651" hits="1"/>
 						<line number="2652" hits="1"/>
 						<line number="2653" hits="1"/>
+						<line number="2654" hits="1"/>
 						<line number="2655" hits="1"/>
 						<line number="2656" hits="1"/>
-						<line number="2657" hits="0"/>
-						<line number="2658" hits="0"/>
-						<line number="2659" hits="0"/>
-						<line number="2661" hits="1"/>
-						<line number="2663" hits="1"/>
+						<line number="2658" hits="1"/>
+						<line number="2659" hits="1"/>
+						<line number="2660" hits="0"/>
+						<line number="2661" hits="0"/>
+						<line number="2662" hits="0"/>
 						<line number="2664" hits="1"/>
-						<line number="2665" hits="0"/>
-						<line number="2666" hits="0"/>
-						<line number="2667" hits="0"/>
-						<line number="2669" hits="1"/>
-						<line number="2670" hits="1"/>
+						<line number="2666" hits="1"/>
+						<line number="2667" hits="1"/>
+						<line number="2668" hits="0"/>
+						<line number="2669" hits="0"/>
+						<line number="2670" hits="0"/>
 						<line number="2672" hits="1"/>
 						<line number="2673" hits="1"/>
 						<line number="2675" hits="1"/>
 						<line number="2676" hits="1"/>
-						<line number="2682" hits="1"/>
-						<line number="2683" hits="1"/>
-						<line number="2684" hits="1"/>
+						<line number="2678" hits="1"/>
+						<line number="2679" hits="1"/>
 						<line number="2685" hits="1"/>
-						<line number="2691" hits="1"/>
-						<line number="2692" hits="1"/>
-						<line number="2693" hits="1"/>
+						<line number="2686" hits="1"/>
+						<line number="2687" hits="1"/>
+						<line number="2688" hits="1"/>
 						<line number="2694" hits="1"/>
-						<line number="2699" hits="1"/>
-						<line number="2701" hits="1"/>
+						<line number="2695" hits="1"/>
+						<line number="2696" hits="1"/>
+						<line number="2697" hits="1"/>
 						<line number="2702" hits="1"/>
-						<line number="2703" hits="1"/>
-						<line number="2705" hits="0"/>
-						<line number="2707" hits="1"/>
-						<line number="2709" hits="1"/>
+						<line number="2704" hits="1"/>
+						<line number="2705" hits="1"/>
+						<line number="2706" hits="1"/>
+						<line number="2708" hits="0"/>
 						<line number="2710" hits="1"/>
-						<line number="2711" hits="1"/>
 						<line number="2712" hits="1"/>
 						<line number="2713" hits="1"/>
 						<line number="2714" hits="1"/>
 						<line number="2715" hits="1"/>
-						<line number="2716" hits="0"/>
-						<line number="2717" hits="0"/>
-						<line number="2718" hits="0"/>
-						<line number="2720" hits="1"/>
+						<line number="2716" hits="1"/>
+						<line number="2717" hits="1"/>
+						<line number="2718" hits="1"/>
+						<line number="2719" hits="0"/>
+						<line number="2720" hits="0"/>
 						<line number="2721" hits="0"/>
 						<line number="2723" hits="1"/>
 						<line number="2724" hits="0"/>
-						<line number="2725" hits="0"/>
-						<line number="2726" hits="0"/>
+						<line number="2726" hits="1"/>
 						<line number="2727" hits="0"/>
 						<line number="2728" hits="0"/>
+						<line number="2729" hits="0"/>
 						<line number="2730" hits="0"/>
 						<line number="2731" hits="0"/>
-						<line number="2732" hits="0"/>
+						<line number="2733" hits="0"/>
 						<line number="2734" hits="0"/>
-						<line number="2736" hits="1"/>
+						<line number="2735" hits="0"/>
 						<line number="2737" hits="0"/>
-						<line number="2738" hits="0"/>
-						<line number="2739" hits="0"/>
+						<line number="2739" hits="1"/>
+						<line number="2740" hits="0"/>
 						<line number="2741" hits="0"/>
 						<line number="2742" hits="0"/>
-						<line number="2743" hits="0"/>
 						<line number="2744" hits="0"/>
 						<line number="2745" hits="0"/>
 						<line number="2746" hits="0"/>
@@ -2407,41 +2404,44 @@
 						<line number="2753" hits="0"/>
 						<line number="2754" hits="0"/>
 						<line number="2755" hits="0"/>
+						<line number="2756" hits="0"/>
 						<line number="2757" hits="0"/>
 						<line number="2758" hits="0"/>
-						<line number="2759" hits="0"/>
-						<line number="2761" hits="1"/>
-						<line number="2763" hits="1"/>
-						<line number="2764" hits="0"/>
-						<line number="2765" hits="0"/>
-						<line number="2770" hits="1"/>
-						<line number="2771" hits="0"/>
-						<line number="2772" hits="0"/>
-						<line number="2777" hits="1"/>
-						<line number="2778" hits="0"/>
-						<line number="2779" hits="0"/>
-						<line number="2784" hits="1"/>
-						<line number="2785" hits="1"/>
-						<line number="2786" hits="1"/>
-						<line number="2791" hits="0"/>
-						<line number="2792" hits="0"/>
+						<line number="2760" hits="0"/>
+						<line number="2761" hits="0"/>
+						<line number="2762" hits="0"/>
+						<line number="2764" hits="1"/>
+						<line number="2766" hits="1"/>
+						<line number="2767" hits="0"/>
+						<line number="2768" hits="0"/>
+						<line number="2773" hits="1"/>
+						<line number="2774" hits="0"/>
+						<line number="2775" hits="0"/>
+						<line number="2780" hits="1"/>
+						<line number="2781" hits="0"/>
+						<line number="2782" hits="0"/>
+						<line number="2787" hits="1"/>
+						<line number="2788" hits="1"/>
+						<line number="2789" hits="1"/>
 						<line number="2794" hits="0"/>
-						<line number="2800" hits="1"/>
-						<line number="2801" hits="0"/>
-						<line number="2802" hits="1"/>
-						<line number="2804" hits="1"/>
-						<line number="2806" hits="1"/>
+						<line number="2795" hits="0"/>
+						<line number="2797" hits="0"/>
+						<line number="2803" hits="1"/>
+						<line number="2804" hits="0"/>
+						<line number="2805" hits="1"/>
 						<line number="2807" hits="1"/>
-						<line number="2808" hits="1"/>
-						<line number="2813" hits="1"/>
-						<line number="2814" hits="1"/>
-						<line number="2815" hits="1"/>
-						<line number="2820" hits="1"/>
-						<line number="2821" hits="1"/>
+						<line number="2809" hits="1"/>
+						<line number="2810" hits="1"/>
+						<line number="2811" hits="1"/>
+						<line number="2816" hits="1"/>
+						<line number="2817" hits="1"/>
+						<line number="2818" hits="1"/>
 						<line number="2823" hits="1"/>
-						<line number="2829" hits="1"/>
-						<line number="2830" hits="0"/>
-						<line number="2831" hits="1"/>
+						<line number="2824" hits="1"/>
+						<line number="2826" hits="1"/>
+						<line number="2832" hits="1"/>
+						<line number="2833" hits="0"/>
+						<line number="2834" hits="1"/>
 					</lines>
 				</class>
 				<class name="s30exception.py" filename="lennoxs30api/s30exception.py" complexity="0" line-rate="0.96" branch-rate="0">
@@ -2551,7 +2551,7 @@
 				</class>
 			</classes>
 		</package>
-		<package name="tests" line-rate="0.9845" branch-rate="0" complexity="0">
+		<package name="tests" line-rate="0.9842" branch-rate="0" complexity="0">
 			<classes>
 				<class name="conftest.py" filename="tests/conftest.py" complexity="0" line-rate="0.9655" branch-rate="0">
 					<methods/>
@@ -4784,38 +4784,37 @@
 						<line number="51" hits="1"/>
 						<line number="53" hits="1"/>
 						<line number="54" hits="1"/>
-						<line number="55" hits="1"/>
+						<line number="56" hits="1"/>
 						<line number="57" hits="1"/>
 						<line number="58" hits="1"/>
 						<line number="59" hits="1"/>
 						<line number="60" hits="1"/>
 						<line number="61" hits="1"/>
-						<line number="62" hits="1"/>
+						<line number="64" hits="1"/>
 						<line number="65" hits="1"/>
-						<line number="66" hits="1"/>
+						<line number="68" hits="1"/>
 						<line number="69" hits="1"/>
 						<line number="70" hits="1"/>
-						<line number="71" hits="1"/>
-						<line number="74" hits="1"/>
+						<line number="73" hits="1"/>
+						<line number="75" hits="1"/>
 						<line number="76" hits="1"/>
 						<line number="77" hits="1"/>
-						<line number="78" hits="1"/>
+						<line number="79" hits="1"/>
 						<line number="80" hits="1"/>
-						<line number="81" hits="1"/>
+						<line number="82" hits="1"/>
 						<line number="83" hits="1"/>
 						<line number="84" hits="1"/>
 						<line number="85" hits="1"/>
-						<line number="86" hits="1"/>
+						<line number="89" hits="1"/>
 						<line number="90" hits="1"/>
 						<line number="91" hits="1"/>
-						<line number="92" hits="1"/>
+						<line number="94" hits="1"/>
 						<line number="95" hits="1"/>
 						<line number="96" hits="1"/>
 						<line number="97" hits="1"/>
-						<line number="98" hits="1"/>
+						<line number="100" hits="1"/>
 						<line number="101" hits="1"/>
 						<line number="102" hits="1"/>
-						<line number="103" hits="1"/>
 					</lines>
 				</class>
 				<class name="test_lcc_device_response.py" filename="tests/test_lcc_device_response.py" complexity="0" line-rate="1" branch-rate="0">
@@ -7763,17 +7762,15 @@
 						<line number="49" hits="1"/>
 					</lines>
 				</class>
-				<class name="test_ventilation.py" filename="tests/test_ventilation.py" complexity="0" line-rate="0.9568" branch-rate="0">
+				<class name="test_ventilation.py" filename="tests/test_ventilation.py" complexity="0" line-rate="0.9532" branch-rate="0">
 					<methods/>
 					<lines>
-						<line number="1" hits="1"/>
-						<line number="11" hits="1"/>
-						<line number="12" hits="1"/>
-						<line number="14" hits="1"/>
-						<line number="16" hits="1"/>
-						<line number="19" hits="1"/>
+						<line number="4" hits="1"/>
+						<line number="5" hits="1"/>
+						<line number="6" hits="1"/>
+						<line number="8" hits="1"/>
+						<line number="17" hits="1"/>
 						<line number="20" hits="1"/>
-						<line number="21" hits="1"/>
 						<line number="22" hits="1"/>
 						<line number="23" hits="1"/>
 						<line number="24" hits="1"/>
@@ -7788,28 +7785,27 @@
 						<line number="33" hits="1"/>
 						<line number="34" hits="1"/>
 						<line number="35" hits="1"/>
-						<line number="38" hits="1"/>
-						<line number="39" hits="1"/>
+						<line number="36" hits="1"/>
+						<line number="37" hits="1"/>
 						<line number="40" hits="1"/>
-						<line number="41" hits="1"/>
 						<line number="42" hits="1"/>
 						<line number="43" hits="1"/>
 						<line number="44" hits="1"/>
 						<line number="45" hits="1"/>
 						<line number="46" hits="1"/>
-						<line number="47" hits="0"/>
-						<line number="48" hits="0"/>
+						<line number="47" hits="1"/>
+						<line number="48" hits="1"/>
 						<line number="49" hits="1"/>
-						<line number="50" hits="1"/>
+						<line number="50" hits="0"/>
+						<line number="51" hits="0"/>
 						<line number="52" hits="1"/>
 						<line number="53" hits="1"/>
-						<line number="54" hits="1"/>
 						<line number="55" hits="1"/>
+						<line number="56" hits="1"/>
 						<line number="57" hits="1"/>
 						<line number="58" hits="1"/>
 						<line number="60" hits="1"/>
 						<line number="61" hits="1"/>
-						<line number="62" hits="1"/>
 						<line number="63" hits="1"/>
 						<line number="64" hits="1"/>
 						<line number="65" hits="1"/>
@@ -7819,29 +7815,28 @@
 						<line number="69" hits="1"/>
 						<line number="70" hits="1"/>
 						<line number="71" hits="1"/>
+						<line number="72" hits="1"/>
+						<line number="73" hits="1"/>
 						<line number="74" hits="1"/>
-						<line number="75" hits="1"/>
-						<line number="76" hits="1"/>
 						<line number="77" hits="1"/>
-						<line number="78" hits="1"/>
 						<line number="79" hits="1"/>
 						<line number="80" hits="1"/>
 						<line number="81" hits="1"/>
 						<line number="82" hits="1"/>
-						<line number="83" hits="0"/>
-						<line number="84" hits="0"/>
+						<line number="83" hits="1"/>
+						<line number="84" hits="1"/>
 						<line number="85" hits="1"/>
 						<line number="86" hits="1"/>
-						<line number="88" hits="1"/>
+						<line number="87" hits="0"/>
+						<line number="88" hits="0"/>
 						<line number="89" hits="1"/>
 						<line number="90" hits="1"/>
-						<line number="91" hits="1"/>
+						<line number="92" hits="1"/>
 						<line number="93" hits="1"/>
 						<line number="94" hits="1"/>
-						<line number="96" hits="1"/>
+						<line number="95" hits="1"/>
 						<line number="97" hits="1"/>
 						<line number="98" hits="1"/>
-						<line number="99" hits="1"/>
 						<line number="100" hits="1"/>
 						<line number="101" hits="1"/>
 						<line number="102" hits="1"/>
@@ -7851,60 +7846,96 @@
 						<line number="106" hits="1"/>
 						<line number="107" hits="1"/>
 						<line number="108" hits="1"/>
+						<line number="109" hits="1"/>
+						<line number="110" hits="1"/>
 						<line number="111" hits="1"/>
 						<line number="112" hits="1"/>
-						<line number="113" hits="1"/>
-						<line number="114" hits="1"/>
 						<line number="115" hits="1"/>
-						<line number="116" hits="1"/>
 						<line number="117" hits="1"/>
 						<line number="118" hits="1"/>
 						<line number="119" hits="1"/>
-						<line number="120" hits="0"/>
-						<line number="121" hits="0"/>
+						<line number="120" hits="1"/>
+						<line number="121" hits="1"/>
 						<line number="122" hits="1"/>
 						<line number="123" hits="1"/>
-						<line number="125" hits="1"/>
-						<line number="126" hits="1"/>
+						<line number="124" hits="1"/>
+						<line number="125" hits="0"/>
+						<line number="126" hits="0"/>
 						<line number="127" hits="1"/>
 						<line number="128" hits="1"/>
 						<line number="130" hits="1"/>
 						<line number="131" hits="1"/>
+						<line number="132" hits="1"/>
 						<line number="133" hits="1"/>
-						<line number="134" hits="1"/>
 						<line number="135" hits="1"/>
 						<line number="136" hits="1"/>
-						<line number="137" hits="1"/>
 						<line number="138" hits="1"/>
 						<line number="139" hits="1"/>
 						<line number="140" hits="1"/>
 						<line number="141" hits="1"/>
 						<line number="142" hits="1"/>
 						<line number="143" hits="1"/>
+						<line number="144" hits="1"/>
 						<line number="145" hits="1"/>
 						<line number="146" hits="1"/>
 						<line number="147" hits="1"/>
 						<line number="148" hits="1"/>
 						<line number="149" hits="1"/>
 						<line number="150" hits="1"/>
-						<line number="151" hits="1"/>
-						<line number="152" hits="1"/>
 						<line number="153" hits="1"/>
-						<line number="154" hits="1"/>
 						<line number="155" hits="1"/>
+						<line number="156" hits="1"/>
 						<line number="157" hits="1"/>
 						<line number="158" hits="1"/>
 						<line number="159" hits="1"/>
 						<line number="160" hits="1"/>
 						<line number="161" hits="1"/>
 						<line number="162" hits="1"/>
-						<line number="163" hits="1"/>
-						<line number="164" hits="1"/>
+						<line number="163" hits="0"/>
+						<line number="164" hits="0"/>
 						<line number="165" hits="1"/>
 						<line number="166" hits="1"/>
-						<line number="167" hits="1"/>
 						<line number="168" hits="1"/>
 						<line number="169" hits="1"/>
+						<line number="170" hits="1"/>
+						<line number="171" hits="1"/>
+						<line number="173" hits="1"/>
+						<line number="174" hits="1"/>
+						<line number="176" hits="1"/>
+						<line number="177" hits="1"/>
+						<line number="178" hits="1"/>
+						<line number="179" hits="1"/>
+						<line number="180" hits="1"/>
+						<line number="181" hits="1"/>
+						<line number="182" hits="1"/>
+						<line number="183" hits="1"/>
+						<line number="184" hits="1"/>
+						<line number="185" hits="1"/>
+						<line number="186" hits="1"/>
+						<line number="188" hits="1"/>
+						<line number="189" hits="1"/>
+						<line number="190" hits="1"/>
+						<line number="191" hits="1"/>
+						<line number="192" hits="1"/>
+						<line number="193" hits="1"/>
+						<line number="194" hits="1"/>
+						<line number="195" hits="1"/>
+						<line number="196" hits="1"/>
+						<line number="197" hits="1"/>
+						<line number="198" hits="1"/>
+						<line number="200" hits="1"/>
+						<line number="201" hits="1"/>
+						<line number="202" hits="1"/>
+						<line number="203" hits="1"/>
+						<line number="204" hits="1"/>
+						<line number="205" hits="1"/>
+						<line number="206" hits="1"/>
+						<line number="207" hits="1"/>
+						<line number="208" hits="1"/>
+						<line number="209" hits="1"/>
+						<line number="210" hits="1"/>
+						<line number="211" hits="1"/>
+						<line number="212" hits="1"/>
 					</lines>
 				</class>
 				<class name="test_zone_enabled.py" filename="tests/test_zone_enabled.py" complexity="0" line-rate="1" branch-rate="0">
diff --git a/lennoxs30api/__init__.py b/lennoxs30api/__init__.py
index 8fa7787..51c49fb 100644
--- a/lennoxs30api/__init__.py
+++ b/lennoxs30api/__init__.py
@@ -1,4 +1,4 @@
-__version__ = "0.2.9"
+__version__ = "0.2.10"
 from .lennox_home import *
 from .lennox_period import *
 from .lennox_schedule import *
diff --git a/lennoxs30api/s30api_async.py b/lennoxs30api/s30api_async.py
index f8b8646..090fac8 100644
--- a/lennoxs30api/s30api_async.py
+++ b/lennoxs30api/s30api_async.py
@@ -191,6 +191,15 @@
 LENNOX_VENTILATION_CONTROL_MODE_TIMED: Final = "timed"
 LENNOX_VENTILATION_CONTROL_MODE_ASHRAE: Final = "ashrae"
 
+LENNOX_VENTILATION_MODE_ON: Final = "on"
+LENNOX_VENTILATION_MODE_OFF: Final = "off"
+LENNOX_VENTILATION_MODE_INSTALLER: Final = "installer"
+LENNOX_VENTILATION_MODES = [
+    LENNOX_VENTILATION_MODE_ON,
+    LENNOX_VENTILATION_MODE_OFF,
+    LENNOX_VENTILATION_MODE_INSTALLER,
+]
+
 # Parameter range for zoneTestControl
 PID_ZONE_1_BLOWER_CFM = 256
 PID_ZONE_8_HEATING_CFM = 279
@@ -202,6 +211,9 @@
 LENNOX_BLE_COMMSTATUS_AVAILABLE: Final = "active"
 LENNOX_BLE_STATUS_INPUT_AVAILABLE: Final = "0"
 
+LENNOX_PRODUCT_TYPE_S40: Final = "S40"
+LENNOX_PRODUCT_TYPE_S30: Final = "S30"
+
 # NOTE:  This application id is super important and a point of brittleness.  You can find this in the burp logs between the mobile app and the Lennox server.
 # If we start getting reports of missesd message, this is the place to look....
 # Here is what I do know
@@ -239,6 +251,7 @@ def __init__(
         message_debug_logging=True,
         message_logging_file=None,
         timeout: int = None,
+        long_poll_delay: int = None,
     ):
         """Initialize the API interface.
         username: The user name to login with when using a cloud connection
@@ -257,6 +270,7 @@ def __init__(
         self._pii_message_logs = pii_message_logs
         self.message_log = MessageLogger(_LOGGER, message_debug_logging, message_logging_file)
         self.timeout: int = 300 if timeout is None else timeout
+        self.long_poll_delay: int = 15 if long_poll_delay is None else long_poll_delay
         # Generate a unique app id, following the existing formatting
         if app_id is None:
             dt = datetime.now()
@@ -331,7 +345,7 @@ def getClientId(self) -> str:
         return self._applicationid + "_" + self._username
 
     async def shutdown(self) -> None:
-        if self.isLANConnection is True or self.loginBearerToken is not None:
+        if self._session is not None and self.isLANConnection is True or self.loginBearerToken is not None:
             await self.logout()
         await self._close_session()
 
@@ -340,7 +354,7 @@ async def logout(self) -> None:
         system = self.system_list
         if self.isLANConnection:
             system = self.getSystem("LCC")
-            if system is not None and system.productType == "S40":
+            if system is not None and system.is_s40:
                 _LOGGER.debug("Skipping logout for S40 thermostat")
                 return
         url: str = self.url_logout
@@ -681,7 +695,7 @@ async def messagePump(self) -> None:
                 "StartTime": "1",
             }
             if self.isLANConnection:
-                params["LongPollingTimeout"] = "5"
+                params["LongPollingTimeout"] = str(self.long_poll_delay)
             else:
                 params["LongPollingTimeout"] = "0"
 
@@ -1029,7 +1043,7 @@ def __init__(self, sysId: str):
         self.single_setpoint_mode: bool = False
         self.temperatureUnit: str = None
         self.indoorUnitType: str = None
-        self.productType = None
+        self.productType: str = None
         self.outdoorUnitType: str = None
         self.humidifierType = None
         self.dehumidifierType = None
@@ -1104,6 +1118,21 @@ def __init__(self, sysId: str):
         self.iaq_co2_lta_valid = None
         self.iaq_co2_component_score = None
 
+        # Weather - S40 only
+        self.wt_is_valid: bool = None
+        self.wt_env_airQuality: str = None
+        self.wt_env_tree: str = None
+        self.wt_env_weed: str = None
+        self.wt_env_grass: str = None
+        self.wt_env_mold: str = None
+        self.wt_env_uvIndex: str = None
+        self.wt_env_humidity: int = None
+        self.wt_env_windSpeed: float = None
+        self.wt_env_windSpeedK: float = None
+        self.wt_env_cloudCoverage: int = None
+        self.wt_env_dewpoint: float = None
+        self.wt_env_dewpointC: float = None
+
         self._dirty = False
         self._dirtyList = []
         self.message_processing_list = {
@@ -1119,6 +1148,7 @@ def __init__(self, sysId: str):
             "alerts": self._process_alerts,
             "ble": self._process_ble,
             "indoorAirQuality": self._process_indoor_air_quality,
+            "weather": self._process_weather,
         }
 
         self.equipment: dict[int, lennox_equipment] = {}
@@ -1330,11 +1360,30 @@ def _process_indoor_air_quality(self, iaq):
                     self.attr_updater(sensor, "lta_validNumber", f"iaq_{name}_lta_valid")
                     self.attr_updater(sensor, "component_score", f"iaq_{name}_component_score")
 
+    def _process_weather(self, weather):
+        if "status" in weather:
+            status = weather["status"]
+            self.attr_updater(status, "isValid", "wt_is_valid")
+            if "env" in status:
+                env = weather["status"]["env"]
+                self.attr_updater(env, "airQuality", "wt_env_airQuality")
+                self.attr_updater(env, "tree", "wt_env_tree")
+                self.attr_updater(env, "weed", "wt_env_weed")
+                self.attr_updater(env, "grass", "wt_env_grass")
+                self.attr_updater(env, "mold", "wt_env_mold")
+                self.attr_updater(env, "uvIndex", "wt_env_uvIndex")
+                self.attr_updater(env, "humidity", "wt_env_humidity")
+                self.attr_updater(env, "windSpeed", "wt_env_windSpeed")
+                self.attr_updater(env, "windSpeedK", "wt_env_windSpeedK")
+                self.attr_updater(env, "cloudCoverage", "wt_env_cloudCoverage")
+                self.attr_updater(env, "Dewpoint", "wt_env_dewpoint")
+                self.attr_updater(env, "DewpointC", "wt_env_dewpointC")
+
     def _processSchedules(self, schedules):
         """Processes the schedule messages, throws base exceptions if a problem is encoutered"""
         for schedule in schedules:
             self._dirty = True
-            if "schedules" in self._dirtyList is False:
+            if "schedules" not in self._dirtyList:
                 self._dirtyList.append("schedules")
             schedule_id = schedule["id"]
             if "schedule" in schedule:
@@ -1635,12 +1684,24 @@ def unique_id(self) -> str:
         # connected to the LAN the sysid is alway "LCC" - which is not unique - so in this case we use the device serial number.
         if self.sysId == "LCC":
             # The S40 no longer populates the serial number, so get it from the unit_serial_number
-            if self.productType == "S40":
+            if self.is_s40:
                 return self.equipment[0].unit_serial_number
             else:
                 return self.serialNumber
         return self.sysId
 
+    @property
+    def is_s40(self) -> bool:
+        if self.productType is None:
+            return False
+        return self.productType.casefold() == LENNOX_PRODUCT_TYPE_S40.casefold()
+
+    @property
+    def is_s30(self) -> bool:
+        if self.productType is None:
+            return False
+        return self.productType.casefold() == LENNOX_PRODUCT_TYPE_S30.casefold()
+
     def config_complete(self) -> bool:
         if self.name is None:
             return False
@@ -1810,21 +1871,22 @@ def _processZonesMessage(self, message):
     def supports_ventilation(self) -> bool:
         return self.is_none(self.ventilationUnitType) is False
 
-    async def ventilation_on(self) -> None:
-        _LOGGER.debug(f"ventilation_on sysid [{self.sysId}]")
+    async def _ventilation_helper(self, mode: str) -> None:
+        _LOGGER.debug(f"ventilation_[{mode}]on sysid [{self.sysId}]")
         if self.supports_ventilation() is False:
-            err_msg = f"ventilation_on - attempting to turn ventilation on for non-supported equipment ventilatorUnitType [{self.ventilationUnitType}]"
+            err_msg = f"_ventilation_helper - attempting to turn ventilation on for non-supported equipment ventilatorUnitType [{self.ventilationUnitType}]"
             raise S30Exception(err_msg, EC_EQUIPMENT_DNS, 1)
-        command = {"system": {"config": {"ventilationMode": "on"}}}
+        command = {"system": {"config": {"ventilationMode": mode}}}
         await self.api.publish_message_helper_dict(self.sysId, command)
 
+    async def ventilation_on(self) -> None:
+        await self._ventilation_helper("on")
+
     async def ventilation_off(self) -> None:
-        _LOGGER.debug(f"ventilation_off sysid [{self.sysId}] ")
-        if self.supports_ventilation() is False:
-            err_msg = f"ventilation_off - attempting to turn ventilation off for non-supported equipment ventilatorUnitType [{self.ventilationUnitType}]"
-            raise S30Exception(err_msg, EC_EQUIPMENT_DNS, 1)
-        command = {"system": {"config": {"ventilationMode": "off"}}}
-        await self.api.publish_message_helper_dict(self.sysId, command)
+        await self._ventilation_helper("off")
+
+    async def ventilation_installer(self) -> None:
+        await self._ventilation_helper("installer")
 
     async def ventilation_timed(self, durationSecs: int) -> None:
         _LOGGER.debug(f"ventilation_timed sysid [{self.sysId}] durationSecs [{durationSecs}] ")
diff --git a/setup.py b/setup.py
index c282aeb..11415ab 100644
--- a/setup.py
+++ b/setup.py
@@ -5,7 +5,7 @@
 
 setuptools.setup(
     name="lennoxs30api",
-    version="0.2.9",
+    version="0.2.10",
     description="API Wrapper for Lennox S30 Cloud and LAN API",
     long_description=long_description,
     long_description_content_type="text/markdown",
diff --git a/simulator/conf/conf_system_04_ac_furnace_zoning.json b/simulator/conf/conf_system_04_ac_furnace_zoning.json
index 6ebd9ca..bd4015b 100644
--- a/simulator/conf/conf_system_04_ac_furnace_zoning.json
+++ b/simulator/conf/conf_system_04_ac_furnace_zoning.json
@@ -8,6 +8,7 @@
     "alertFile" :     "tests/messages/system_04_furn_ac_zoning_alerts.json",
     "bleFile" :       "tests/messages/system_04_furn_ac_zoning_ble.json",
     "iaqFile" :       "tests/messages/system_04_furn_ac_zoning_indoorAirQuality.json",
+    "weatherFile":    "tests/messages/weather.json",
     "productType":    "S40",
     "outdoorTempSim" : false,
     "zoneSim" : false,
diff --git a/simulator/main.py b/simulator/main.py
index 53d1221..0381377 100644
--- a/simulator/main.py
+++ b/simulator/main.py
@@ -338,6 +338,9 @@ def process_request_data(self, data):
                 if "alertFile" in self.config_data:
                     data = self.loadfile(self.config_data["alertFile"])
                     app.queue.append(data)
+                if "weatherFile" in self.config_data:
+                    data = self.loadfile(self.config_data["weatherFile"])
+                    app.queue.append(data)
 
                 asyncio.create_task(self.outdoorTempSimulator())
                 asyncio.create_task(self.zoneSimulator())


Test patch:
diff --git a/tests/messages/weather.json b/tests/messages/weather.json
new file mode 100644
index 0000000..ff96bb4
--- /dev/null
+++ b/tests/messages/weather.json
@@ -0,0 +1,378 @@
+{
+    "MessageId": 0,
+    "SenderID": "**redacted**",
+    "TargetID": "homeassistant",
+    "MessageType": "PropertyChange",
+    "Data": {
+        "weather": {
+            "publisher": {
+                "publisherName": "remote"
+            },
+            "status": {
+                "isValid": true,
+                "city": "**redacted**",
+                "state": "IL",
+                "current": [
+                    {
+                        "temperature": 69.0,
+                        "temperatureC": 21.0,
+                        "temperatureLow": 61.0,
+                        "temperatureLowC": 16.0,
+                        "temperatureHigh": 74.0,
+                        "temperatureHighC": 23.0,
+                        "iconId": 7,
+                        "time": 1695331380,
+                        "id": 0,
+                        "iconDescription": "Cloudy",
+                        "cloudCoverage": 98,
+                        "atmosPressure": 30.15,
+                        "rainProbability": 96,
+                        "sunrise": 1695296340,
+                        "sunset": 1695340320
+                    }
+                ],
+                "hourly": [
+                    {
+                        "temperature": 70.0,
+                        "temperatureC": 21.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 12,
+                        "time": 1695333600,
+                        "id": 0,
+                        "iconDescription": "Rain showers",
+                        "cloudCoverage": 97,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 66,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 69.0,
+                        "temperatureC": 21.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 4,
+                        "time": 1695337200,
+                        "id": 1,
+                        "iconDescription": "Partly cloudy",
+                        "cloudCoverage": 70,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 49,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 68.0,
+                        "temperatureC": 20.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 36,
+                        "time": 1695340800,
+                        "id": 2,
+                        "iconDescription": "Partly cloudy",
+                        "cloudCoverage": 70,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 47,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 66.0,
+                        "temperatureC": 19.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 38,
+                        "time": 1695344400,
+                        "id": 3,
+                        "iconDescription": "Mostly cloudy",
+                        "cloudCoverage": 89,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 44,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 65.0,
+                        "temperatureC": 18.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 7,
+                        "time": 1695348000,
+                        "id": 4,
+                        "iconDescription": "Cloudy",
+                        "cloudCoverage": 90,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 48,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 64.0,
+                        "temperatureC": 18.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 12,
+                        "time": 1695351600,
+                        "id": 5,
+                        "iconDescription": "Rain showers",
+                        "cloudCoverage": 93,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 52,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 64.0,
+                        "temperatureC": 18.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 7,
+                        "time": 1695355200,
+                        "id": 6,
+                        "iconDescription": "Cloudy",
+                        "cloudCoverage": 96,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 43,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 64.0,
+                        "temperatureC": 18.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 12,
+                        "time": 1695358800,
+                        "id": 7,
+                        "iconDescription": "Rain showers",
+                        "cloudCoverage": 98,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 51,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 64.0,
+                        "temperatureC": 18.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 7,
+                        "time": 1695362400,
+                        "id": 8,
+                        "iconDescription": "Cloudy",
+                        "cloudCoverage": 98,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 43,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 63.0,
+                        "temperatureC": 17.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 12,
+                        "time": 1695366000,
+                        "id": 9,
+                        "iconDescription": "Rain showers",
+                        "cloudCoverage": 96,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 51,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 63.0,
+                        "temperatureC": 17.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 7,
+                        "time": 1695369600,
+                        "id": 10,
+                        "iconDescription": "Cloudy",
+                        "cloudCoverage": 92,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 47,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 63.0,
+                        "temperatureC": 17.0,
+                        "temperatureLow": 0.0,
+                        "temperatureLowC": 0.0,
+                        "temperatureHigh": 0.0,
+                        "temperatureHighC": 0.0,
+                        "iconId": 7,
+                        "time": 1695373200,
+                        "id": 11,
+                        "iconDescription": "Cloudy",
+                        "cloudCoverage": 90,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 44,
+                        "sunrise": null,
+                        "sunset": null
+                    }
+                ],
+                "daily": [
+                    {
+                        "temperature": 0.0,
+                        "temperatureC": 0.0,
+                        "temperatureLow": 61.0,
+                        "temperatureLowC": 16.0,
+                        "temperatureHigh": 74.0,
+                        "temperatureHighC": 23.0,
+                        "iconId": 12,
+                        "time": 1695297600,
+                        "id": 0,
+                        "iconDescription": "Rain showers",
+                        "cloudCoverage": 91,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 96,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 0.0,
+                        "temperatureC": 0.0,
+                        "temperatureLow": 59.0,
+                        "temperatureLowC": 15.0,
+                        "temperatureHigh": 78.0,
+                        "temperatureHighC": 26.0,
+                        "iconId": 4,
+                        "time": 1695384000,
+                        "id": 1,
+                        "iconDescription": "Partly cloudy",
+                        "cloudCoverage": 68,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 40,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 0.0,
+                        "temperatureC": 0.0,
+                        "temperatureLow": 57.0,
+                        "temperatureLowC": 14.0,
+                        "temperatureHigh": 79.0,
+                        "temperatureHighC": 26.0,
+                        "iconId": 4,
+                        "time": 1695470400,
+                        "id": 2,
+                        "iconDescription": "Partly cloudy",
+                        "cloudCoverage": 46,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 3,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 0.0,
+                        "temperatureC": 0.0,
+                        "temperatureLow": 56.0,
+                        "temperatureLowC": 13.0,
+                        "temperatureHigh": 73.0,
+                        "temperatureHighC": 23.0,
+                        "iconId": 4,
+                        "time": 1695556800,
+                        "id": 3,
+                        "iconDescription": "Partly cloudy",
+                        "cloudCoverage": 50,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 8,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 0.0,
+                        "temperatureC": 0.0,
+                        "temperatureLow": 58.0,
+                        "temperatureLowC": 14.0,
+                        "temperatureHigh": 70.0,
+                        "temperatureHighC": 21.0,
+                        "iconId": 4,
+                        "time": 1695643200,
+                        "id": 4,
+                        "iconDescription": "Partly cloudy",
+                        "cloudCoverage": 79,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 19,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 0.0,
+                        "temperatureC": 0.0,
+                        "temperatureLow": 55.0,
+                        "temperatureLowC": 13.0,
+                        "temperatureHigh": 70.0,
+                        "temperatureHighC": 21.0,
+                        "iconId": 3,
+                        "time": 1695729600,
+                        "id": 5,
+                        "iconDescription": "Partly cloudy",
+                        "cloudCoverage": 31,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 18,
+                        "sunrise": null,
+                        "sunset": null
+                    },
+                    {
+                        "temperature": 0.0,
+                        "temperatureC": 0.0,
+                        "temperatureLow": 52.0,
+                        "temperatureLowC": 11.0,
+                        "temperatureHigh": 70.0,
+                        "temperatureHighC": 21.0,
+                        "iconId": 1,
+                        "time": 1695816000,
+                        "id": 6,
+                        "iconDescription": "Clear",
+                        "cloudCoverage": 0,
+                        "atmosPressure": 0.0,
+                        "rainProbability": 11,
+                        "sunrise": null,
+                        "sunset": null
+                    }
+                ],
+                "env": {
+                    "airQuality": "good",
+                    "tree": "extreme",
+                    "weed": "very high",
+                    "grass": "high",
+                    "mold": "moderate",
+                    "uvIndex": "low",
+                    "humidity": 84,
+                    "windSpeed": 1.0,
+                    "windSpeedK": 2.0,
+                    "cloudCoverage": 97,
+                    "Dewpoint": 64.0,
+                    "DewpointC": 18.0
+                }
+            }
+        }
+    }
+}
diff --git a/tests/test_config_response.py b/tests/test_config_response.py
index ee5e6d5..31c9002 100644
--- a/tests/test_config_response.py
+++ b/tests/test_config_response.py
@@ -60,6 +60,8 @@ def test_process_configuration_message(api_with_configuration):
     lsystem: lennox_system = api.system_list[0]
     assert lsystem.sysId == "0000000-0000-0000-0000-000000000001"
     assert lsystem.productType == "S30"
+    assert lsystem.is_s30
+    assert not lsystem.is_s40
     assert lsystem.name == "Moetown North"
     assert lsystem.numberOfZones == 4
     assert lsystem.outdoorTemperature == 80
diff --git a/tests/test_iaq.py b/tests/test_iaq.py
index 4cbf99e..61c2612 100644
--- a/tests/test_iaq.py
+++ b/tests/test_iaq.py
@@ -50,7 +50,6 @@ def test_iaq_subscriptions(api_system_04_furn_ac_zoning):
     system: lennox_system = api.system_list[0]
     assert system.sysId == "LCC"
 
-    pass
     message = loadfile("s40_ble.json", "LCC")
     system.processMessage(message)
 
diff --git a/tests/test_s30api_async.py b/tests/test_s30api_async.py
index 2fc9c6d..b4580bf 100644
--- a/tests/test_s30api_async.py
+++ b/tests/test_s30api_async.py
@@ -42,6 +42,7 @@ async def test_shutdown(api: s30api_async):
     with patch.object(api, "logout") as mock_logout, patch.object(api, "_close_session") as mock_close_session:
         api.isLANConnection = True
         api.loginBearerToken = None
+        api._create_session()
         await api.shutdown()
         mock_logout.assert_called_once()
         mock_close_session.assert_called_once()
diff --git a/tests/test_ventilation.py b/tests/test_ventilation.py
index 8e6e7e5..96d7dc7 100644
--- a/tests/test_ventilation.py
+++ b/tests/test_ventilation.py
@@ -1,3 +1,10 @@
+"""Tests ventilation"""
+# pylint: disable=line-too-long
+
+import asyncio
+import json
+from unittest.mock import patch
+
 from lennoxs30api.s30api_async import (
     LENNOX_NONE_STR,
     LENNOX_VENTILATION_1_SPEED_ERV,
@@ -7,35 +14,31 @@
     LENNOX_VENTILATION_DAMPER,
     lennox_system,
 )
-
-import json
-import asyncio
-
-from unittest.mock import patch
-
 from lennoxs30api.s30exception import EC_BAD_PARAMETERS, EC_EQUIPMENT_DNS, S30Exception
 
 
 def test_has_ventilation(api):
+    """Test the different ventilation types"""
     system: lennox_system = api.system_list[0]
     assert system.sysId == "0000000-0000-0000-0000-000000000001"
     system.ventilationUnitType = LENNOX_NONE_STR
-    assert system.supports_ventilation() == False
+    assert system.supports_ventilation() is False
     system.ventilationUnitType = None
-    assert system.supports_ventilation() == False
+    assert system.supports_ventilation() is False
     system.ventilationUnitType = LENNOX_VENTILATION_1_SPEED_ERV
-    assert system.supports_ventilation() == True
+    assert system.supports_ventilation() is True
     system.ventilationUnitType = LENNOX_VENTILATION_2_SPEED_ERV
-    assert system.supports_ventilation() == True
+    assert system.supports_ventilation() is True
     system.ventilationUnitType = LENNOX_VENTILATION_1_SPEED_HRV
-    assert system.supports_ventilation() == True
+    assert system.supports_ventilation() is True
     system.ventilationUnitType = LENNOX_VENTILATION_2_SPEED_HRV
-    assert system.supports_ventilation() == True
+    assert system.supports_ventilation() is True
     system.ventilationUnitType = LENNOX_VENTILATION_DAMPER
-    assert system.supports_ventilation() == True
+    assert system.supports_ventilation() is True
 
 
 def test_set_ventilation_on(api):
+    """Test turning ventilation on"""
     system: lennox_system = api.system_list[0]
     assert system.sysId == "0000000-0000-0000-0000-000000000001"
     assert system.supports_ventilation()
@@ -43,10 +46,10 @@ def test_set_ventilation_on(api):
         loop = asyncio.get_event_loop()
         ex = None
         try:
-            result = loop.run_until_complete(system.ventilation_on())
-        except S30Exception as e:
-            ex = e
-        assert ex == None
+            loop.run_until_complete(system.ventilation_on())
+        except S30Exception as exc:
+            ex = exc
+        assert ex is None
         assert mock_message_helper.call_count == 1
 
         arg0 = mock_message_helper.await_args[0][0]
@@ -58,20 +61,21 @@ def test_set_ventilation_on(api):
         assert config["ventilationMode"] == "on"
 
     system.ventilationUnitType = LENNOX_NONE_STR
-    assert system.supports_ventilation() == False
+    assert system.supports_ventilation() is False
     with patch.object(api, "publishMessageHelper") as mock_message_helper:
         loop = asyncio.get_event_loop()
         ex = None
         try:
-            result = loop.run_until_complete(system.ventilation_on())
-        except S30Exception as e:
-            ex = e
-        assert ex != None
+            loop.run_until_complete(system.ventilation_on())
+        except S30Exception as exc:
+            ex = exc
+        assert ex is not None
         assert ex.error_code == EC_EQUIPMENT_DNS
         assert LENNOX_NONE_STR in ex.message
 
 
 def test_set_ventilation_off(api):
+    """Tests turning the ventilation off"""
     system: lennox_system = api.system_list[0]
     assert system.sysId == "0000000-0000-0000-0000-000000000001"
     assert system.supports_ventilation()
@@ -79,10 +83,10 @@ def test_set_ventilation_off(api):
         loop = asyncio.get_event_loop()
         ex = None
         try:
-            result = loop.run_until_complete(system.ventilation_off())
-        except S30Exception as e:
-            ex = e
-        assert ex == None
+            loop.run_until_complete(system.ventilation_off())
+        except S30Exception as exc:
+            ex = exc
+        assert ex is None
         assert mock_message_helper.call_count == 1
 
         arg0 = mock_message_helper.await_args[0][0]
@@ -94,21 +98,60 @@ def test_set_ventilation_off(api):
         assert config["ventilationMode"] == "off"
 
     system.ventilationUnitType = LENNOX_NONE_STR
-    assert system.supports_ventilation() == False
+    assert system.supports_ventilation() is False
+    with patch.object(api, "publishMessageHelper") as mock_message_helper:
+        loop = asyncio.get_event_loop()
+        ex = None
+        try:
+            loop.run_until_complete(system.ventilation_off())
+        except S30Exception as exc:
+            ex = exc
+        assert mock_message_helper.call_count == 0
+        assert ex is not None
+        assert ex.error_code == EC_EQUIPMENT_DNS
+        assert LENNOX_NONE_STR in ex.message
+
+
+def test_set_ventilation_installer(api):
+    """Tests setting ventilation to installer mode"""
+    system: lennox_system = api.system_list[0]
+    assert system.sysId == "0000000-0000-0000-0000-000000000001"
+    assert system.supports_ventilation()
+    with patch.object(api, "publishMessageHelper") as mock_message_helper:
+        loop = asyncio.get_event_loop()
+        ex = None
+        try:
+            loop.run_until_complete(system.ventilation_installer())
+        except S30Exception as exc:
+            ex = exc
+        assert ex is None
+        assert mock_message_helper.call_count == 1
+
+        arg0 = mock_message_helper.await_args[0][0]
+        assert arg0 == system.sysId
+        arg1 = mock_message_helper.await_args[0][1]
+        jsbody = json.loads("{" + arg1 + "}")
+
+        config = jsbody["Data"]["system"]["config"]
+        assert config["ventilationMode"] == "installer"
+
+    system.ventilationUnitType = LENNOX_NONE_STR
+    assert system.supports_ventilation() is False
     with patch.object(api, "publishMessageHelper") as mock_message_helper:
         loop = asyncio.get_event_loop()
         ex = None
         try:
-            result = loop.run_until_complete(system.ventilation_off())
-        except S30Exception as e:
-            ex = e
+            loop.run_until_complete(system.ventilation_installer())
+        except S30Exception as exc:
+            ex = exc
         assert mock_message_helper.call_count == 0
-        assert ex != None
+        assert ex is not None
         assert ex.error_code == EC_EQUIPMENT_DNS
         assert LENNOX_NONE_STR in ex.message
 
 
 def test_set_ventilation_timed(api):
+    """Test setting timed ventilation"""
     system: lennox_system = api.system_list[0]
     assert system.sysId == "0000000-0000-0000-0000-000000000001"
     assert system.supports_ventilation()
@@ -116,10 +159,10 @@ def test_set_ventilation_timed(api):
         loop = asyncio.get_event_loop()
         ex = None
         try:
-            result = loop.run_until_complete(system.ventilation_timed(600))
-        except S30Exception as e:
-            ex = e
-        assert ex == None
+            loop.run_until_complete(system.ventilation_timed(600))
+        except S30Exception as exc:
+            ex = exc
+        assert ex is None
         assert mock_message_helper.call_count == 1
 
         arg0 = mock_message_helper.await_args[0][0]
@@ -134,11 +177,11 @@ def test_set_ventilation_timed(api):
         loop = asyncio.get_event_loop()
         ex = None
         try:
-            result = loop.run_until_complete(system.ventilation_timed(-600))
-        except S30Exception as e:
-            ex = e
+            loop.run_until_complete(system.ventilation_timed(-600))
+        except S30Exception as exc:
+            ex = exc
         assert mock_message_helper.call_count == 0
-        assert ex != None
+        assert ex is not None
         assert ex.error_code == EC_BAD_PARAMETERS
         assert "-600" in ex.message
 
@@ -146,24 +189,24 @@ def test_set_ventilation_timed(api):
         loop = asyncio.get_event_loop()
         ex = None
         try:
-            result = loop.run_until_complete(system.ventilation_timed("ABC"))
-        except S30Exception as e:
-            ex = e
+            loop.run_until_complete(system.ventilation_timed("ABC"))
+        except S30Exception as exc:
+            ex = exc
         assert mock_message_helper.call_count == 0
-        assert ex != None
+        assert ex is not None
         assert ex.error_code == EC_BAD_PARAMETERS
         assert "ABC" in ex.message
 
     system.ventilationUnitType = LENNOX_NONE_STR
-    assert system.supports_ventilation() == False
+    assert system.supports_ventilation() is False
     with patch.object(api, "publishMessageHelper") as mock_message_helper:
         loop = asyncio.get_event_loop()
         ex = None
         try:
-            result = loop.run_until_complete(system.ventilation_timed(600))
-        except S30Exception as e:
-            ex = e
+            loop.run_until_complete(system.ventilation_timed(600))
+        except S30Exception as exc:
+            ex = exc
         assert mock_message_helper.call_count == 0
-        assert ex != None
+        assert ex is not None
         assert ex.error_code == EC_EQUIPMENT_DNS
         assert LENNOX_NONE_STR in ex.message
diff --git a/tests/test_weather.py b/tests/test_weather.py
new file mode 100644
index 0000000..7f9de1f
--- /dev/null
+++ b/tests/test_weather.py
@@ -0,0 +1,63 @@
+"""Tests for weather devices"""
+# pylint: disable=line-too-long
+from lennoxs30api.s30api_async import lennox_system
+
+from tests.conftest import loadfile
+
+
+def test_weather_config(api_system_04_furn_ac_zoning):
+    """Tests weather config loading"""
+    api = api_system_04_furn_ac_zoning
+    system: lennox_system = api.system_list[0]
+    assert system.sysId == "LCC"
+
+    message = loadfile("weather.json", "LCC")
+    system.processMessage(message)
+
+    assert system.wt_is_valid is True
+    assert system.wt_env_airQuality == "good"
+    assert system.wt_env_tree == "extreme"
+    assert system.wt_env_weed == "very high"
+    assert system.wt_env_grass == "high"
+    assert system.wt_env_mold == "moderate"
+    assert system.wt_env_uvIndex == "low"
+    assert system.wt_env_humidity == 84
+    assert system.wt_env_windSpeed == 1.0
+    assert system.wt_env_windSpeedK == 2.0
+    assert system.wt_env_cloudCoverage == 97
+    assert system.wt_env_dewpoint == 64.0
+    assert system.wt_env_dewpointC == 18.0
+
+
+class CallbackHandler(object):
+    """Handler for callbacks"""
+
+    def __init__(self):
+        self.called = 0
+
+    def update_callback(self):
+        """Callback for changes"""
+        self.called = self.called + 1
+
+
+def test_weather_subscriptions(api_system_04_furn_ac_zoning):
+    """Tests subscriptions"""
+    api = api_system_04_furn_ac_zoning
+    system: lennox_system = api.system_list[0]
+    assert system.sysId == "LCC"
+
+    message = loadfile("weather.json", "LCC")
+    system.processMessage(message)
+
+    message["Data"]["weather"]["status"]["env"]["airQuality"] = "error"
+    callback_handler = CallbackHandler()
+    system.registerOnUpdateCallback(callback_handler.update_callback, ["wt_env_airQuality"])
+
+    # Test 1 - processing message should invoke callback
+    system.processMessage(message)
+    assert callback_handler.called == 1
+
+    # Test 2 - reprocessing message should not invoke callback
+    callback_handler.called = 0
+    system.processMessage(message)
+    assert callback_handler.called == 0