<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1786213690">
  <project timestamp="1786213690">
    <file name="/workspace/src/extensions/LoginNotify/includes/EchoHooks.php">
      <class name="LoginNotify\EchoHooks" namespace="global">
        <metrics complexity="4" methods="2" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="46" coveredstatements="0" elements="48" coveredelements="0"/>
      </class>
      <line num="27" type="method" name="onBeforeCreateEchoEvent" visibility="public" complexity="2" crap="6" count="0"/>
      <line num="34" type="stmt" count="0"/>
      <line num="35" type="stmt" count="0"/>
      <line num="36" type="stmt" count="0"/>
      <line num="38" type="stmt" count="0"/>
      <line num="39" type="stmt" count="0"/>
      <line num="40" type="stmt" count="0"/>
      <line num="41" type="stmt" count="0"/>
      <line num="43" type="stmt" count="0"/>
      <line num="44" type="stmt" count="0"/>
      <line num="45" type="stmt" count="0"/>
      <line num="46" type="stmt" count="0"/>
      <line num="47" type="stmt" count="0"/>
      <line num="48" type="stmt" count="0"/>
      <line num="49" type="stmt" count="0"/>
      <line num="50" type="stmt" count="0"/>
      <line num="51" type="stmt" count="0"/>
      <line num="52" type="stmt" count="0"/>
      <line num="53" type="stmt" count="0"/>
      <line num="54" type="stmt" count="0"/>
      <line num="55" type="stmt" count="0"/>
      <line num="56" type="stmt" count="0"/>
      <line num="57" type="stmt" count="0"/>
      <line num="58" type="stmt" count="0"/>
      <line num="59" type="stmt" count="0"/>
      <line num="60" type="stmt" count="0"/>
      <line num="61" type="stmt" count="0"/>
      <line num="62" type="stmt" count="0"/>
      <line num="63" type="stmt" count="0"/>
      <line num="64" type="stmt" count="0"/>
      <line num="65" type="stmt" count="0"/>
      <line num="66" type="stmt" count="0"/>
      <line num="67" type="stmt" count="0"/>
      <line num="68" type="stmt" count="0"/>
      <line num="69" type="stmt" count="0"/>
      <line num="70" type="stmt" count="0"/>
      <line num="71" type="stmt" count="0"/>
      <line num="72" type="stmt" count="0"/>
      <line num="73" type="stmt" count="0"/>
      <line num="74" type="stmt" count="0"/>
      <line num="75" type="stmt" count="0"/>
      <line num="76" type="stmt" count="0"/>
      <line num="77" type="stmt" count="0"/>
      <line num="85" type="method" name="onEchoGetBundleRules" visibility="public" complexity="2" crap="6" count="0"/>
      <line num="86" type="stmt" count="0"/>
      <line num="87" type="stmt" count="0"/>
      <line num="88" type="stmt" count="0"/>
      <line num="89" type="stmt" count="0"/>
      <metrics loc="93" ncloc="78" classes="1" methods="2" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="46" coveredstatements="0" elements="48" coveredelements="0"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/includes/Hooks.php">
      <class name="LoginNotify\Hooks" namespace="global">
        <metrics complexity="13" methods="6" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="18" coveredstatements="0" elements="24" coveredelements="0"/>
      </class>
      <line num="23" type="method" name="__construct" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="27" type="stmt" count="0"/>
      <line num="37" type="method" name="onAuthManagerLoginAuthenticateAudit" visibility="public" complexity="7" crap="56" count="0"/>
      <line num="40" type="stmt" count="0"/>
      <line num="41" type="stmt" count="0"/>
      <line num="44" type="stmt" count="0"/>
      <line num="45" type="stmt" count="0"/>
      <line num="48" type="stmt" count="0"/>
      <line num="49" type="stmt" count="0"/>
      <line num="51" type="stmt" count="0"/>
      <line num="52" type="stmt" count="0"/>
      <line num="54" type="stmt" count="0"/>
      <line num="66" type="method" name="doSuccessfulLogin" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="67" type="stmt" count="0"/>
      <line num="68" type="stmt" count="0"/>
      <line num="69" type="stmt" count="0"/>
      <line num="77" type="method" name="doFailedLogin" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="78" type="stmt" count="0"/>
      <line num="90" type="method" name="onLocalUserCreated" visibility="public" complexity="2" crap="6" count="0"/>
      <line num="91" type="stmt" count="0"/>
      <line num="92" type="stmt" count="0"/>
      <line num="99" type="method" name="onRecentChange_save" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="100" type="stmt" count="0"/>
      <line num="101" type="stmt" count="0"/>
      <metrics loc="104" ncloc="67" classes="1" methods="6" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="18" coveredstatements="0" elements="24" coveredelements="0"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/includes/Hooks/HookRunner.php">
      <class name="LoginNotify\Hooks\HookRunner" namespace="global">
        <metrics complexity="2" methods="2" coveredmethods="2" conditionals="0" coveredconditionals="0" statements="5" coveredstatements="5" elements="7" coveredelements="7"/>
      </class>
      <line num="15" type="method" name="__construct" visibility="public" complexity="1" crap="1" count="1"/>
      <line num="16" type="stmt" count="1"/>
      <line num="21" type="method" name="onAuthManagerLoginAuthenticateAudit" visibility="public" complexity="1" crap="1" count="1"/>
      <line num="24" type="stmt" count="1"/>
      <line num="25" type="stmt" count="1"/>
      <line num="26" type="stmt" count="1"/>
      <line num="27" type="stmt" count="1"/>
      <metrics loc="30" ncloc="23" classes="1" methods="2" coveredmethods="2" conditionals="0" coveredconditionals="0" statements="5" coveredstatements="5" elements="7" coveredelements="7"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/includes/KnownIPPreAuthenticationProvider.php">
      <class name="LoginNotify\KnownIPPreAuthenticationProvider" namespace="global">
        <metrics complexity="5" methods="2" coveredmethods="2" conditionals="0" coveredconditionals="0" statements="20" coveredstatements="20" elements="22" coveredelements="22"/>
      </class>
      <line num="19" type="method" name="__construct" visibility="public" complexity="1" crap="1" count="4"/>
      <line num="23" type="stmt" count="4"/>
      <line num="25" type="method" name="testForAuthentication" visibility="public" complexity="4" crap="4" count="4"/>
      <line num="26" type="stmt" count="4"/>
      <line num="27" type="stmt" count="1"/>
      <line num="30" type="stmt" count="3"/>
      <line num="32" type="stmt" count="3"/>
      <line num="33" type="stmt" count="3"/>
      <line num="34" type="stmt" count="1"/>
      <line num="37" type="stmt" count="2"/>
      <line num="39" type="stmt" count="2"/>
      <line num="41" type="stmt" count="2"/>
      <line num="42" type="stmt" count="1"/>
      <line num="45" type="stmt" count="1"/>
      <line num="46" type="stmt" count="1"/>
      <line num="47" type="stmt" count="1"/>
      <line num="48" type="stmt" count="1"/>
      <line num="49" type="stmt" count="1"/>
      <line num="50" type="stmt" count="1"/>
      <line num="51" type="stmt" count="1"/>
      <line num="52" type="stmt" count="1"/>
      <line num="54" type="stmt" count="1"/>
      <metrics loc="57" ncloc="51" classes="1" methods="2" coveredmethods="2" conditionals="0" coveredconditionals="0" statements="20" coveredstatements="20" elements="22" coveredelements="22"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/includes/LoginNotify.php">
      <class name="LoginNotify\LoginNotify" namespace="global">
        <metrics complexity="93" methods="38" coveredmethods="23" conditionals="0" coveredconditionals="0" statements="330" coveredstatements="277" elements="368" coveredelements="300"/>
      </class>
      <line num="80" type="method" name="getInstance" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="81" type="stmt" count="0"/>
      <line num="84" type="method" name="__construct" visibility="public" complexity="2" crap="2" count="42"/>
      <line num="94" type="stmt" count="42"/>
      <line num="96" type="stmt" count="42"/>
      <line num="97" type="stmt" count="42"/>
      <line num="99" type="stmt" count="1"/>
      <line num="100" type="stmt" count="1"/>
      <line num="108" type="method" name="setLogger" visibility="public" complexity="1" crap="1" count="42"/>
      <line num="109" type="stmt" count="42"/>
      <line num="123" type="method" name="getIPNetwork" visibility="private" complexity="4" crap="4.02" count="12"/>
      <line num="124" type="stmt" count="12"/>
      <line num="125" type="stmt" count="12"/>
      <line num="127" type="stmt" count="4"/>
      <line num="128" type="stmt" count="8"/>
      <line num="130" type="stmt" count="7"/>
      <line num="132" type="stmt" count="1"/>
      <line num="134" type="stmt" count="11"/>
      <line num="135" type="stmt" count="11"/>
      <line num="136" type="stmt" count="0"/>
      <line num="138" type="stmt" count="11"/>
      <line num="146" type="method" name="getSalt" visibility="private" complexity="2" crap="2" count="11"/>
      <line num="148" type="stmt" count="11"/>
      <line num="149" type="stmt" count="11"/>
      <line num="152" type="stmt" count="11"/>
      <line num="162" type="method" name="isKnownSystem" visibility="public" complexity="3" crap="3.01" count="3"/>
      <line num="163" type="stmt" count="3"/>
      <line num="164" type="stmt" count="3"/>
      <line num="165" type="stmt" count="3"/>
      <line num="166" type="stmt" count="0"/>
      <line num="167" type="stmt" count="0"/>
      <line num="170" type="stmt" count="3"/>
      <line num="171" type="stmt" count="3"/>
      <line num="172" type="stmt" count="3"/>
      <line num="173" type="stmt" count="3"/>
      <line num="174" type="stmt" count="2"/>
      <line num="175" type="stmt" count="2"/>
      <line num="178" type="stmt" count="2"/>
      <line num="180" type="stmt" count="2"/>
      <line num="181" type="stmt" count="2"/>
      <line num="182" type="stmt" count="2"/>
      <line num="183" type="stmt" count="2"/>
      <line num="185" type="stmt" count="2"/>
      <line num="195" type="method" name="userIsInSeenTable" visibility="private" complexity="3" crap="3.00" count="3"/>
      <line num="196" type="stmt" count="3"/>
      <line num="197" type="stmt" count="0"/>
      <line num="199" type="stmt" count="3"/>
      <line num="200" type="stmt" count="3"/>
      <line num="201" type="stmt" count="3"/>
      <line num="202" type="stmt" count="3"/>
      <line num="203" type="stmt" count="3"/>
      <line num="204" type="stmt" count="3"/>
      <line num="205" type="stmt" count="3"/>
      <line num="206" type="stmt" count="3"/>
      <line num="207" type="stmt" count="3"/>
      <line num="208" type="stmt" count="3"/>
      <line num="209" type="stmt" count="3"/>
      <line num="210" type="stmt" count="3"/>
      <line num="221" type="method" name="userIsInCurrentSeenBucket" visibility="private" complexity="3" crap="3.02" count="5"/>
      <line num="222" type="stmt" count="5"/>
      <line num="223" type="stmt" count="0"/>
      <line num="225" type="stmt" count="5"/>
      <line num="226" type="stmt" count="0"/>
      <line num="228" type="stmt" count="5"/>
      <line num="230" type="stmt" count="5"/>
      <line num="231" type="stmt" count="5"/>
      <line num="232" type="stmt" count="5"/>
      <line num="233" type="stmt" count="5"/>
      <line num="234" type="stmt" count="5"/>
      <line num="235" type="stmt" count="5"/>
      <line num="236" type="stmt" count="5"/>
      <line num="237" type="stmt" count="5"/>
      <line num="238" type="stmt" count="5"/>
      <line num="239" type="stmt" count="5"/>
      <line num="250" type="method" name="getSeenHash" visibility="private" complexity="1" crap="1" count="5"/>
      <line num="251" type="stmt" count="5"/>
      <line num="252" type="stmt" count="5"/>
      <line num="254" type="stmt" count="5"/>
      <line num="268" type="method" name="packedSignedInt64ToDecimal" visibility="private" complexity="5" crap="19.47" count="10"/>
      <line num="269" type="stmt" count="10"/>
      <line num="271" type="stmt" count="10"/>
      <line num="275" type="stmt" count="0"/>
      <line num="277" type="stmt" count="0"/>
      <line num="278" type="stmt" count="0"/>
      <line num="279" type="stmt" count="0"/>
      <line num="281" type="stmt" count="0"/>
      <line num="282" type="stmt" count="0"/>
      <line num="283" type="stmt" count="0"/>
      <line num="284" type="stmt" count="0"/>
      <line num="287" type="stmt" count="0"/>
      <line num="289" type="stmt" count="0"/>
      <line num="298" type="method" name="getSeenReplicaDb" visibility="private" complexity="1" crap="1" count="5"/>
      <line num="299" type="stmt" count="5"/>
      <line num="307" type="method" name="getSeenPrimaryDb" visibility="private" complexity="1" crap="1" count="5"/>
      <line num="308" type="stmt" count="5"/>
      <line num="316" type="method" name="getMinBucket" visibility="private" complexity="1" crap="1" count="5"/>
      <line num="317" type="stmt" count="5"/>
      <line num="318" type="stmt" count="5"/>
      <line num="319" type="stmt" count="5"/>
      <line num="320" type="stmt" count="5"/>
      <line num="328" type="method" name="getCurrentBucket" visibility="private" complexity="1" crap="1" count="5"/>
      <line num="329" type="stmt" count="5"/>
      <line num="337" type="method" name="getCurrentTime" visibility="private" complexity="1" crap="1" count="5"/>
      <line num="338" type="stmt" count="5"/>
      <line num="346" type="method" name="setFakeTime" visibility="public" complexity="1" crap="1" count="3"/>
      <line num="347" type="stmt" count="3"/>
      <line num="362" type="method" name="getMaybeCentralId" visibility="private" complexity="2" crap="2.15" count="5"/>
      <line num="363" type="stmt" count="5"/>
      <line num="364" type="stmt" count="0"/>
      <line num="366" type="stmt" count="5"/>
      <line num="376" type="method" name="setLoginCookie" visibility="private" complexity="1" crap="2" count="0"/>
      <line num="377" type="stmt" count="0"/>
      <line num="378" type="stmt" count="0"/>
      <line num="379" type="stmt" count="0"/>
      <line num="380" type="stmt" count="0"/>
      <line num="381" type="stmt" count="0"/>
      <line num="382" type="stmt" count="0"/>
      <line num="383" type="stmt" count="0"/>
      <line num="384" type="stmt" count="0"/>
      <line num="385" type="stmt" count="0"/>
      <line num="386" type="stmt" count="0"/>
      <line num="388" type="stmt" count="0"/>
      <line num="389" type="stmt" count="0"/>
      <line num="390" type="stmt" count="0"/>
      <line num="400" type="method" name="recordKnownWithCookie" visibility="public" complexity="2" crap="6" count="0"/>
      <line num="401" type="stmt" count="0"/>
      <line num="402" type="stmt" count="0"/>
      <line num="404" type="stmt" count="0"/>
      <line num="405" type="stmt" count="0"/>
      <line num="415" type="method" name="recordKnown" visibility="public" complexity="6" crap="6.01" count="5"/>
      <line num="416" type="stmt" count="5"/>
      <line num="417" type="stmt" count="0"/>
      <line num="419" type="stmt" count="5"/>
      <line num="420" type="stmt" count="5"/>
      <line num="421" type="stmt" count="0"/>
      <line num="424" type="stmt" count="5"/>
      <line num="425" type="stmt" count="5"/>
      <line num="428" type="stmt" count="5"/>
      <line num="429" type="stmt" count="0"/>
      <line num="433" type="stmt" count="5"/>
      <line num="434" type="stmt" count="2"/>
      <line num="435" type="stmt" count="2"/>
      <line num="436" type="stmt" count="2"/>
      <line num="437" type="stmt" count="2"/>
      <line num="441" type="stmt" count="2"/>
      <line num="442" type="stmt" count="2"/>
      <line num="443" type="stmt" count="2"/>
      <line num="444" type="stmt" count="2"/>
      <line num="445" type="stmt" count="2"/>
      <line num="446" type="stmt" count="2"/>
      <line num="451" type="stmt" count="5"/>
      <line num="452" type="stmt" count="5"/>
      <line num="453" type="stmt" count="5"/>
      <line num="454" type="stmt" count="5"/>
      <line num="455" type="stmt" count="5"/>
      <line num="456" type="stmt" count="5"/>
      <line num="457" type="stmt" count="5"/>
      <line num="458" type="stmt" count="5"/>
      <line num="459" type="stmt" count="5"/>
      <line num="460" type="stmt" count="5"/>
      <line num="461" type="stmt" count="5"/>
      <line num="462" type="stmt" count="5"/>
      <line num="463" type="stmt" count="5"/>
      <line num="464" type="stmt" count="5"/>
      <line num="465" type="stmt" count="5"/>
      <line num="466" type="stmt" count="5"/>
      <line num="467" type="stmt" count="5"/>
      <line num="469" type="stmt" count="5"/>
      <line num="470" type="stmt" count="5"/>
      <line num="471" type="stmt" count="5"/>
      <line num="472" type="stmt" count="5"/>
      <line num="473" type="stmt" count="5"/>
      <line num="474" type="stmt" count="5"/>
      <line num="487" type="method" name="getMinExpiredId" visibility="public" complexity="3" crap="3" count="2"/>
      <line num="488" type="stmt" count="2"/>
      <line num="489" type="stmt" count="2"/>
      <line num="490" type="stmt" count="2"/>
      <line num="491" type="stmt" count="2"/>
      <line num="492" type="stmt" count="2"/>
      <line num="493" type="stmt" count="2"/>
      <line num="494" type="stmt" count="2"/>
      <line num="496" type="stmt" count="2"/>
      <line num="497" type="stmt" count="2"/>
      <line num="500" type="stmt" count="2"/>
      <line num="510" type="method" name="purgeSeen" visibility="public" complexity="2" crap="2" count="2"/>
      <line num="511" type="stmt" count="2"/>
      <line num="512" type="stmt" count="2"/>
      <line num="514" type="stmt" count="2"/>
      <line num="515" type="stmt" count="2"/>
      <line num="516" type="stmt" count="2"/>
      <line num="517" type="stmt" count="2"/>
      <line num="518" type="stmt" count="2"/>
      <line num="519" type="stmt" count="2"/>
      <line num="520" type="stmt" count="2"/>
      <line num="521" type="stmt" count="2"/>
      <line num="522" type="stmt" count="2"/>
      <line num="525" type="stmt" count="2"/>
      <line num="526" type="stmt" count="2"/>
      <line num="528" type="stmt" count="1"/>
      <line num="539" type="method" name="mergeResults" visibility="private" complexity="5" crap="5.20" count="3"/>
      <line num="540" type="stmt" count="3"/>
      <line num="541" type="stmt" count="2"/>
      <line num="543" type="stmt" count="2"/>
      <line num="544" type="stmt" count="2"/>
      <line num="546" type="stmt" count="0"/>
      <line num="556" type="method" name="userIsInCookie" visibility="private" complexity="3" crap="3.33" count="3"/>
      <line num="557" type="stmt" count="3"/>
      <line num="559" type="stmt" count="3"/>
      <line num="560" type="stmt" count="3"/>
      <line num="562" type="stmt" count="0"/>
      <line num="563" type="stmt" count="0"/>
      <line num="566" type="stmt" count="3"/>
      <line num="575" type="method" name="getPrevLoginCookie" visibility="private" complexity="1" crap="1" count="4"/>
      <line num="576" type="stmt" count="4"/>
      <line num="590" type="method" name="checkAndGenerateCookie" visibility="private" complexity="7" crap="7" count="7"/>
      <line num="591" type="stmt" count="7"/>
      <line num="592" type="stmt" count="7"/>
      <line num="593" type="stmt" count="1"/>
      <line num="595" type="stmt" count="6"/>
      <line num="597" type="stmt" count="7"/>
      <line num="598" type="stmt" count="7"/>
      <line num="600" type="stmt" count="7"/>
      <line num="601" type="stmt" count="6"/>
      <line num="603" type="stmt" count="2"/>
      <line num="605" type="stmt" count="5"/>
      <line num="606" type="stmt" count="5"/>
      <line num="607" type="stmt" count="5"/>
      <line num="608" type="stmt" count="4"/>
      <line num="611" type="stmt" count="7"/>
      <line num="630" type="method" name="isUserRecordGivenCookie" visibility="private" complexity="2" crap="2" count="14"/>
      <line num="631" type="stmt" count="14"/>
      <line num="634" type="stmt" count="3"/>
      <line num="636" type="stmt" count="11"/>
      <line num="637" type="stmt" count="11"/>
      <line num="638" type="stmt" count="11"/>
      <line num="647" type="method" name="validateCookieRecord" visibility="private" complexity="4" crap="4" count="20"/>
      <line num="648" type="stmt" count="20"/>
      <line num="649" type="stmt" count="20"/>
      <line num="650" type="stmt" count="5"/>
      <line num="651" type="stmt" count="5"/>
      <line num="652" type="stmt" count="5"/>
      <line num="653" type="stmt" count="5"/>
      <line num="654" type="stmt" count="5"/>
      <line num="655" type="stmt" count="5"/>
      <line num="656" type="stmt" count="5"/>
      <line num="658" type="stmt" count="16"/>
      <line num="661" type="stmt" count="6"/>
      <line num="663" type="stmt" count="12"/>
      <line num="682" type="method" name="generateUserCookieRecord" visibility="private" complexity="4" crap="4.02" count="16"/>
      <line num="683" type="stmt" count="16"/>
      <line num="684" type="stmt" count="9"/>
      <line num="687" type="stmt" count="16"/>
      <line num="688" type="stmt" count="11"/>
      <line num="692" type="stmt" count="16"/>
      <line num="694" type="stmt" count="16"/>
      <line num="696" type="stmt" count="0"/>
      <line num="698" type="stmt" count="16"/>
      <line num="699" type="stmt" count="16"/>
      <line num="709" type="method" name="getKey" visibility="private" complexity="1" crap="1" count="5"/>
      <line num="710" type="stmt" count="5"/>
      <line num="711" type="stmt" count="5"/>
      <line num="712" type="stmt" count="5"/>
      <line num="713" type="stmt" count="5"/>
      <line num="723" type="method" name="recordLoginFailureFromUnknownSystem" visibility="private" complexity="2" crap="2" count="1"/>
      <line num="724" type="stmt" count="1"/>
      <line num="725" type="stmt" count="1"/>
      <line num="726" type="stmt" count="1"/>
      <line num="727" type="stmt" count="1"/>
      <line num="728" type="stmt" count="1"/>
      <line num="729" type="stmt" count="1"/>
      <line num="730" type="stmt" count="1"/>
      <line num="731" type="stmt" count="1"/>
      <line num="732" type="stmt" count="1"/>
      <line num="733" type="stmt" count="1"/>
      <line num="734" type="stmt" count="1"/>
      <line num="735" type="stmt" count="1"/>
      <line num="736" type="stmt" count="1"/>
      <line num="739" type="stmt" count="1"/>
      <line num="740" type="stmt" count="1"/>
      <line num="741" type="stmt" count="1"/>
      <line num="742" type="stmt" count="1"/>
      <line num="743" type="stmt" count="1"/>
      <line num="744" type="stmt" count="1"/>
      <line num="745" type="stmt" count="1"/>
      <line num="755" type="method" name="recordLoginFailureFromKnownSystem" visibility="private" complexity="2" crap="2" count="2"/>
      <line num="756" type="stmt" count="2"/>
      <line num="757" type="stmt" count="2"/>
      <line num="758" type="stmt" count="2"/>
      <line num="759" type="stmt" count="2"/>
      <line num="760" type="stmt" count="2"/>
      <line num="761" type="stmt" count="2"/>
      <line num="762" type="stmt" count="2"/>
      <line num="763" type="stmt" count="2"/>
      <line num="764" type="stmt" count="2"/>
      <line num="765" type="stmt" count="2"/>
      <line num="766" type="stmt" count="2"/>
      <line num="777" type="method" name="sendNotice" visibility="private" complexity="2" crap="2" count="3"/>
      <line num="778" type="stmt" count="3"/>
      <line num="779" type="stmt" count="3"/>
      <line num="780" type="stmt" count="3"/>
      <line num="781" type="stmt" count="3"/>
      <line num="782" type="stmt" count="3"/>
      <line num="783" type="stmt" count="3"/>
      <line num="784" type="stmt" count="3"/>
      <line num="785" type="stmt" count="3"/>
      <line num="786" type="stmt" count="3"/>
      <line num="787" type="stmt" count="3"/>
      <line num="788" type="stmt" count="3"/>
      <line num="789" type="stmt" count="3"/>
      <line num="790" type="stmt" count="3"/>
      <line num="791" type="stmt" count="2"/>
      <line num="793" type="stmt" count="3"/>
      <line num="794" type="stmt" count="3"/>
      <line num="795" type="stmt" count="3"/>
      <line num="796" type="stmt" count="3"/>
      <line num="797" type="stmt" count="3"/>
      <line num="808" type="method" name="checkAndIncKey" visibility="private" complexity="2" crap="2" count="5"/>
      <line num="809" type="stmt" count="5"/>
      <line num="811" type="stmt" count="5"/>
      <line num="812" type="stmt" count="5"/>
      <line num="813" type="stmt" count="5"/>
      <line num="815" type="stmt" count="2"/>
      <line num="826" type="method" name="clearCounters" visibility="public" complexity="1" crap="1" count="2"/>
      <line num="827" type="stmt" count="2"/>
      <line num="828" type="stmt" count="2"/>
      <line num="829" type="stmt" count="2"/>
      <line num="831" type="stmt" count="2"/>
      <line num="832" type="stmt" count="2"/>
      <line num="840" type="method" name="recordFailure" visibility="public" complexity="4" crap="4.69" count="3"/>
      <line num="841" type="stmt" count="3"/>
      <line num="844" type="stmt" count="0"/>
      <line num="845" type="stmt" count="0"/>
      <line num="846" type="stmt" count="0"/>
      <line num="847" type="stmt" count="0"/>
      <line num="848" type="stmt" count="0"/>
      <line num="849" type="stmt" count="0"/>
      <line num="850" type="stmt" count="0"/>
      <line num="854" type="stmt" count="3"/>
      <line num="855" type="stmt" count="1"/>
      <line num="856" type="stmt" count="1"/>
      <line num="857" type="stmt" count="1"/>
      <line num="858" type="stmt" count="1"/>
      <line num="859" type="stmt" count="1"/>
      <line num="860" type="stmt" count="1"/>
      <line num="861" type="stmt" count="1"/>
      <line num="864" type="stmt" count="2"/>
      <line num="865" type="stmt" count="2"/>
      <line num="866" type="stmt" count="2"/>
      <line num="868" type="stmt" count="1"/>
      <line num="877" type="method" name="sendSuccessNotice" visibility="public" complexity="4" crap="4.59" count="1"/>
      <line num="878" type="stmt" count="1"/>
      <line num="879" type="stmt" count="0"/>
      <line num="881" type="stmt" count="1"/>
      <line num="882" type="stmt" count="1"/>
      <line num="884" type="stmt" count="0"/>
      <line num="885" type="stmt" count="0"/>
      <line num="886" type="stmt" count="0"/>
      <line num="887" type="stmt" count="1"/>
      <line num="888" type="stmt" count="1"/>
      <line num="889" type="stmt" count="1"/>
      <line num="890" type="stmt" count="1"/>
      <line num="891" type="stmt" count="1"/>
      <line num="903" type="method" name="incrStats" visibility="private" complexity="2" crap="2" count="4"/>
      <line num="907" type="stmt" count="4"/>
      <line num="908" type="stmt" count="4"/>
      <line num="910" type="stmt" count="4"/>
      <line num="911" type="stmt" count="4"/>
      <line num="914" type="stmt" count="4"/>
      <metrics loc="917" ncloc="596" classes="1" methods="38" coveredmethods="23" conditionals="0" coveredconditionals="0" statements="330" coveredstatements="277" elements="368" coveredelements="300"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/includes/PresentationModel.php">
      <class name="LoginNotify\PresentationModel" namespace="global">
        <metrics complexity="12" methods="5" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="45" coveredstatements="0" elements="50" coveredelements="0"/>
      </class>
      <line num="18" type="method" name="getIconType" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="19" type="stmt" count="0"/>
      <line num="27" type="method" name="getPrimaryLink" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="28" type="stmt" count="0"/>
      <line num="29" type="stmt" count="0"/>
      <line num="30" type="stmt" count="0"/>
      <line num="31" type="stmt" count="0"/>
      <line num="39" type="method" name="getSubjectMessage" visibility="public" complexity="4" crap="20" count="0"/>
      <line num="40" type="stmt" count="0"/>
      <line num="41" type="stmt" count="0"/>
      <line num="42" type="stmt" count="0"/>
      <line num="43" type="stmt" count="0"/>
      <line num="44" type="stmt" count="0"/>
      <line num="45" type="stmt" count="0"/>
      <line num="46" type="stmt" count="0"/>
      <line num="48" type="stmt" count="0"/>
      <line num="49" type="stmt" count="0"/>
      <line num="50" type="stmt" count="0"/>
      <line num="52" type="stmt" count="0"/>
      <line num="60" type="method" name="getHeaderMessage" visibility="public" complexity="5" crap="30" count="0"/>
      <line num="61" type="stmt" count="0"/>
      <line num="63" type="stmt" count="0"/>
      <line num="64" type="stmt" count="0"/>
      <line num="65" type="stmt" count="0"/>
      <line num="66" type="stmt" count="0"/>
      <line num="68" type="stmt" count="0"/>
      <line num="70" type="stmt" count="0"/>
      <line num="71" type="stmt" count="0"/>
      <line num="72" type="stmt" count="0"/>
      <line num="73" type="stmt" count="0"/>
      <line num="74" type="stmt" count="0"/>
      <line num="75" type="stmt" count="0"/>
      <line num="76" type="stmt" count="0"/>
      <line num="77" type="stmt" count="0"/>
      <line num="78" type="stmt" count="0"/>
      <line num="79" type="stmt" count="0"/>
      <line num="83" type="stmt" count="0"/>
      <line num="84" type="stmt" count="0"/>
      <line num="86" type="stmt" count="0"/>
      <line num="88" type="stmt" count="0"/>
      <line num="90" type="stmt" count="0"/>
      <line num="98" type="method" name="getSecondaryLinks" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="99" type="stmt" count="0"/>
      <line num="100" type="stmt" count="0"/>
      <line num="101" type="stmt" count="0"/>
      <line num="102" type="stmt" count="0"/>
      <line num="103" type="stmt" count="0"/>
      <line num="104" type="stmt" count="0"/>
      <line num="105" type="stmt" count="0"/>
      <line num="107" type="stmt" count="0"/>
      <metrics loc="111" ncloc="81" classes="1" methods="5" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="45" coveredstatements="0" elements="50" coveredelements="0"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/includes/PurgeSeenJob.php">
      <class name="LoginNotify\PurgeSeenJob" namespace="global">
        <metrics complexity="2" methods="2" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="4" coveredstatements="0" elements="6" coveredelements="0"/>
      </class>
      <line num="9" type="method" name="__construct" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="13" type="stmt" count="0"/>
      <line num="17" type="method" name="run" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="18" type="stmt" count="0"/>
      <line num="19" type="stmt" count="0"/>
      <line num="20" type="stmt" count="0"/>
      <metrics loc="23" ncloc="22" classes="1" methods="2" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="4" coveredstatements="0" elements="6" coveredelements="0"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/includes/SchemaHooks.php">
      <class name="LoginNotify\SchemaHooks" namespace="global">
        <metrics complexity="1" methods="1" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="7" coveredstatements="0" elements="8" coveredelements="0"/>
      </class>
      <line num="13" type="method" name="onLoadExtensionSchemaUpdates" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="14" type="stmt" count="0"/>
      <line num="15" type="stmt" count="0"/>
      <line num="16" type="stmt" count="0"/>
      <line num="17" type="stmt" count="0"/>
      <line num="18" type="stmt" count="0"/>
      <line num="19" type="stmt" count="0"/>
      <line num="20" type="stmt" count="0"/>
      <metrics loc="23" ncloc="20" classes="1" methods="1" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="7" coveredstatements="0" elements="8" coveredelements="0"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/includes/ServiceWiring.php">
      <line num="9" type="stmt" count="0"/>
      <line num="10" type="stmt" count="0"/>
      <line num="11" type="stmt" count="0"/>
      <line num="12" type="stmt" count="0"/>
      <line num="13" type="stmt" count="0"/>
      <line num="14" type="stmt" count="0"/>
      <line num="15" type="stmt" count="0"/>
      <line num="16" type="stmt" count="0"/>
      <line num="17" type="stmt" count="0"/>
      <line num="18" type="stmt" count="0"/>
      <line num="19" type="stmt" count="0"/>
      <line num="20" type="stmt" count="0"/>
      <line num="21" type="stmt" count="0"/>
      <line num="22" type="stmt" count="0"/>
      <line num="23" type="stmt" count="0"/>
      <line num="24" type="stmt" count="0"/>
      <line num="25" type="stmt" count="0"/>
      <metrics loc="26" ncloc="26" classes="0" methods="0" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="17" coveredstatements="0" elements="17" coveredelements="0"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/maintenance/loginAttempt.php">
      <class name="LoginNotify\Maintenance\LoginAttempt" namespace="global">
        <metrics complexity="6" methods="2" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="31" coveredstatements="0" elements="33" coveredelements="0"/>
      </class>
      <line num="35" type="method" name="__construct" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="36" type="stmt" count="0"/>
      <line num="37" type="stmt" count="0"/>
      <line num="38" type="stmt" count="0"/>
      <line num="39" type="stmt" count="0"/>
      <line num="40" type="stmt" count="0"/>
      <line num="41" type="stmt" count="0"/>
      <line num="42" type="stmt" count="0"/>
      <line num="44" type="stmt" count="0"/>
      <line num="52" type="method" name="execute" visibility="public" complexity="5" crap="30" count="0"/>
      <line num="53" type="stmt" count="0"/>
      <line num="54" type="stmt" count="0"/>
      <line num="55" type="stmt" count="0"/>
      <line num="56" type="stmt" count="0"/>
      <line num="57" type="stmt" count="0"/>
      <line num="59" type="stmt" count="0"/>
      <line num="60" type="stmt" count="0"/>
      <line num="61" type="stmt" count="0"/>
      <line num="62" type="stmt" count="0"/>
      <line num="64" type="stmt" count="0"/>
      <line num="65" type="stmt" count="0"/>
      <line num="66" type="stmt" count="0"/>
      <line num="67" type="stmt" count="0"/>
      <line num="68" type="stmt" count="0"/>
      <line num="71" type="stmt" count="0"/>
      <line num="72" type="stmt" count="0"/>
      <line num="73" type="stmt" count="0"/>
      <line num="74" type="stmt" count="0"/>
      <line num="75" type="stmt" count="0"/>
      <line num="76" type="stmt" count="0"/>
      <line num="78" type="stmt" count="0"/>
      <line num="79" type="stmt" count="0"/>
      <line num="80" type="stmt" count="0"/>
      <metrics loc="90" ncloc="71" classes="1" methods="2" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="31" coveredstatements="0" elements="33" coveredelements="0"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/maintenance/migratePreferences.php">
      <class name="LoginNotify\Maintenance\MigratePreferences" namespace="global">
        <metrics complexity="11" methods="4" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="57" coveredstatements="0" elements="61" coveredelements="0"/>
      </class>
      <line num="37" type="method" name="__construct" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="38" type="stmt" count="0"/>
      <line num="39" type="stmt" count="0"/>
      <line num="40" type="stmt" count="0"/>
      <line num="48" type="method" name="doDBUpdates" visibility="protected" complexity="5" crap="30" count="0"/>
      <line num="49" type="stmt" count="0"/>
      <line num="50" type="stmt" count="0"/>
      <line num="52" type="stmt" count="0"/>
      <line num="53" type="stmt" count="0"/>
      <line num="54" type="stmt" count="0"/>
      <line num="55" type="stmt" count="0"/>
      <line num="56" type="stmt" count="0"/>
      <line num="57" type="stmt" count="0"/>
      <line num="58" type="stmt" count="0"/>
      <line num="59" type="stmt" count="0"/>
      <line num="60" type="stmt" count="0"/>
      <line num="61" type="stmt" count="0"/>
      <line num="62" type="stmt" count="0"/>
      <line num="63" type="stmt" count="0"/>
      <line num="64" type="stmt" count="0"/>
      <line num="65" type="stmt" count="0"/>
      <line num="66" type="stmt" count="0"/>
      <line num="67" type="stmt" count="0"/>
      <line num="68" type="stmt" count="0"/>
      <line num="69" type="stmt" count="0"/>
      <line num="70" type="stmt" count="0"/>
      <line num="71" type="stmt" count="0"/>
      <line num="73" type="stmt" count="0"/>
      <line num="74" type="stmt" count="0"/>
      <line num="75" type="stmt" count="0"/>
      <line num="76" type="stmt" count="0"/>
      <line num="77" type="stmt" count="0"/>
      <line num="78" type="stmt" count="0"/>
      <line num="79" type="stmt" count="0"/>
      <line num="80" type="stmt" count="0"/>
      <line num="81" type="stmt" count="0"/>
      <line num="83" type="stmt" count="0"/>
      <line num="84" type="stmt" count="0"/>
      <line num="85" type="stmt" count="0"/>
      <line num="86" type="stmt" count="0"/>
      <line num="87" type="stmt" count="0"/>
      <line num="88" type="stmt" count="0"/>
      <line num="89" type="stmt" count="0"/>
      <line num="92" type="stmt" count="0"/>
      <line num="93" type="stmt" count="0"/>
      <line num="95" type="stmt" count="0"/>
      <line num="98" type="stmt" count="0"/>
      <line num="100" type="stmt" count="0"/>
      <line num="102" type="stmt" count="0"/>
      <line num="112" type="method" name="updateUser" visibility="private" complexity="4" crap="20" count="0"/>
      <line num="113" type="stmt" count="0"/>
      <line num="114" type="stmt" count="0"/>
      <line num="115" type="stmt" count="0"/>
      <line num="116" type="stmt" count="0"/>
      <line num="117" type="stmt" count="0"/>
      <line num="119" type="stmt" count="0"/>
      <line num="121" type="stmt" count="0"/>
      <line num="122" type="stmt" count="0"/>
      <line num="123" type="stmt" count="0"/>
      <line num="130" type="method" name="getUpdateKey" visibility="protected" complexity="1" crap="2" count="0"/>
      <line num="131" type="stmt" count="0"/>
      <metrics loc="139" ncloc="114" classes="1" methods="4" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="57" coveredstatements="0" elements="61" coveredelements="0"/>
    </file>
    <file name="/workspace/src/extensions/LoginNotify/maintenance/purgeSeen.php">
      <class name="LoginNotify\Maintenance\PurgeSeen" namespace="global">
        <metrics complexity="4" methods="3" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="7" coveredstatements="0" elements="10" coveredelements="0"/>
      </class>
      <line num="19" type="method" name="__construct" visibility="public" complexity="1" crap="2" count="0"/>
      <line num="20" type="stmt" count="0"/>
      <line num="21" type="stmt" count="0"/>
      <line num="24" type="method" name="execute" visibility="public" complexity="2" crap="6" count="0"/>
      <line num="25" type="stmt" count="0"/>
      <line num="26" type="stmt" count="0"/>
      <line num="27" type="stmt" count="0"/>
      <line num="28" type="stmt" count="0"/>
      <line num="32" type="method" name="getLoginNotify" visibility="private" complexity="1" crap="2" count="0"/>
      <line num="33" type="stmt" count="0"/>
      <metrics loc="41" ncloc="37" classes="1" methods="3" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="7" coveredstatements="0" elements="10" coveredelements="0"/>
    </file>
    <metrics files="12" loc="1654" ncloc="1186" classes="11" methods="67" coveredmethods="27" conditionals="0" coveredconditionals="0" statements="587" coveredstatements="302" elements="654" coveredelements="329"/>
  </project>
</coverage>
