Compare commits

...

2 commits

Author SHA1 Message Date
luc
06c4f5f9ce extra log 2026-09-04 20:29:47 +02:00
luc
fbea7121be scripts 2026-09-04 18:50:13 +02:00
21 changed files with 592 additions and 1173 deletions

View file

@ -33,7 +33,8 @@
} \
} while (0)
constexpr int SleepAfterClear = 2000;
constexpr int SleepAfterClear = 6000; //?
constexpr int SleepBeforeReconnect= 1000; //?
bool g_EnableReleaseLogging;
Epd3Base::Epd3U* current;
@ -60,7 +61,17 @@ void Epd3Base::Epd3U::ResetStepReturnValues()
{
CurrentStep = -1;
HasStepError = 0;
for (int i = MaxSteps - 1; i >= 0; --i) for (int j = 0; j < 4; j++) StepReturnValues[i][j] = 0;
for (int i = MaxSteps - 1; i >= 0; --i) {
StepReturnValues[i][static_cast<size_t>(EpdStepColumns::function)] = 0;
StepReturnValues[i][static_cast<size_t>(EpdStepColumns::commitRV)] = -998;
StepReturnValues[i][static_cast<size_t>(EpdStepColumns::endRV)] = -1;
StepReturnValues[i][static_cast<size_t>(EpdStepColumns::canIgnorore)] = 0;
StepReturnValues[i][static_cast<size_t>(EpdStepColumns::commitMS)] = -1;
StepReturnValues[i][static_cast<size_t>(EpdStepColumns::endMS)] = -1;
StepReturnValues[i][static_cast<size_t>(EpdStepColumns::endCode)] = 0;
StepReturnValues[i][static_cast<size_t>(EpdStepColumns::commitCode)] = 0;
}
resetErrors();
}
@ -70,18 +81,33 @@ int Epd3Base::Epd3U::SetFunctionReturnValue(enum eFunctions f, BYTE CanIgnore)
if (CurrentStep < MaxSteps - 1) {
++CurrentStep;
if (CurrentStep == 0) HasStepError = 0;
StepReturnValues[CurrentStep][0] = f;
StepReturnValues[CurrentStep][1] = -1;
StepReturnValues[CurrentStep][2] = -1;
StepReturnValues[CurrentStep][3] = CanIgnore;
StepReturnValues[CurrentStep][static_cast<size_t>(EpdStepColumns::function)] = f;
StepReturnValues[CurrentStep][static_cast<size_t>(EpdStepColumns::commitRV)] = -998;
StepReturnValues[CurrentStep][static_cast<size_t>(EpdStepColumns::endRV)] = -1;
StepReturnValues[CurrentStep][static_cast<size_t>(EpdStepColumns::canIgnorore)] = CanIgnore;
StepReturnValues[CurrentStep][static_cast<size_t>(EpdStepColumns::commitMS)] = -1;
StepReturnValues[CurrentStep][static_cast<size_t>(EpdStepColumns::endMS)] = -1;
StepReturnValues[CurrentStep][static_cast<size_t>(EpdStepColumns::commitCode)] = 0;
StepReturnValues[CurrentStep][static_cast<size_t>(EpdStepColumns::endCode)] = 0;
}
return CurrentStep;
}
void Epd3Base::Epd3U::SetCommitReturnValue(int step, int32_t rv)
{
if (CurrentStep >= 0 && CurrentStep < MaxSteps)
StepReturnValues[step][1] = rv;
if (CurrentStep >= 0 && CurrentStep < MaxSteps) {
StepReturnValues[step][static_cast<size_t>(EpdStepColumns::commitRV)] = rv;
auto endTime = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::duration<int32_t, std::milli>>(endTime - sessionStart);
StepReturnValues[step][static_cast<size_t>(EpdStepColumns::commitMS)] = duration.count();
if (rv)
StepReturnValues[step][static_cast<size_t>(EpdStepColumns::commitCode)] = GetErrorCode();
else
StepReturnValues[step][static_cast<size_t>(EpdStepColumns::commitCode)] = 0;
}
}
void Epd3Base::Epd3U::SetCommitReturnValue(int32_t rv)
@ -92,12 +118,19 @@ void Epd3Base::Epd3U::SetCommitReturnValue(int32_t rv)
uint32_t Epd3Base::Epd3U::SetEndReturnValue(int step, int32_t rv)
{
if (step >= 0 && step < MaxSteps) {
StepReturnValues[step][2] = rv;
StepReturnValues[step][static_cast<size_t>(EpdStepColumns::endRV)] = rv;
auto endTime = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::duration<int32_t, std::milli>>(endTime - sessionStart);
StepReturnValues[step][static_cast<size_t>(EpdStepColumns::endMS)] = duration.count();
if (StepReturnValues[step][static_cast<size_t>(EpdStepColumns::endMS)]<=0)
StepReturnValues[step][static_cast<size_t>(EpdStepColumns::commitRV)] = 1;
if (rv != 0) {
HasStepError = 1;
if (StepReturnValues[step][3]) rv = 0; //if canIngore set rv ok
if (StepReturnValues[step][static_cast<size_t>(EpdStepColumns::canIgnorore)]) rv = 0; //if canIgnore set this return rv ok
Error = GetErrorCode();
}
StepReturnValues[step][static_cast<size_t>(EpdStepColumns::endCode)] = Error;
} else
StepReturnValues[step][static_cast<size_t>(EpdStepColumns::endCode)] = 0;
}
return rv;
}
@ -213,7 +246,8 @@ Epd3Base::Epd3U::Epd3U(int _comport)
RealTime = EpdClock = OffTime = EpdID = 0;
EPDFaulty = false;
EPDTimeFault = 0;
EPDDetectorTestRequested = false;
hasAlarm = hasFault = 0;
ErrorSource = ErrorReason = ErrorData = 0;
HardVersion = HardVersionMinor = HardVersionBuild = HardVersionRevision = SoftVersion = SoftVersionMinor = SoftVersionBuild = SoftVersionPatch = FunctionFlags = 0;
@ -253,13 +287,18 @@ Epd3Base::Epd3U::~Epd3U()
int Epd3Base::Epd3U::DisconnectAndConnect()
{
int rv = 0;
SetFunctionReturnValue(fDisconnect, 1);
rv = Disconnect(epdComsHandle);
Sleep(200);
SetEndReturnValue(rv);
int tries = 3; rv = 1;
while (rv && --tries>=0) {
Sleep(SleepBeforeReconnect);
SetFunctionReturnValue(fConnect, 1);
rv = Connect3(epdComsHandle, Epd, true);
SetEndReturnValue(rv);
DebugWrite("**** DisconnectAndConnect rv={} tries {} ****\n", rv, tries);
if (rv) Sleep(100);
}
return rv;
@ -298,7 +337,7 @@ DWORD Epd3Base::Epd3U::StartCom()
epdComsHandle = CreateReaderInterface();
if (!epdComsHandle) step = 3;
while (epdComsHandle == nullptr && ++ConnectRetries < 4) {
Sleep(200);
epdComsHandle = CreateReaderInterface(); //try again;
}
SetCommitReturnValue(0);
@ -328,7 +367,7 @@ DWORD Epd3Base::Epd3U::StartCom()
Dll3RV = OpenReader(epdComsHandle, comPort);
}
SetCommitReturnValue(0);
if (!Dll3RV) SetEndReturnValue(0); else SetEndReturnValue(-1);
if (!Dll3RV) SetEndReturnValue(Dll3RV); else SetEndReturnValue(Dll3RV);
if (Dll3RV == 0)
{
@ -471,14 +510,14 @@ int Epd3Base::Epd3U::ReConnect()
{
if (epdComsHandle != nullptr)
{
SetFunctionReturnValue(fConnect, 0);
Dll3RV = Connect3(epdComsHandle, Epd, true);
SetEndReturnValue(Dll3RV);
if (Dll3RV) {
//r_OperationTimeout == -9
incrementError(Dll3RV);
DebugWrite("**** Connect3 rv {} ****\n", Dll3RV); // r_operationtimeout
Sleep(50);
Dll3RV = DisconnectAndConnect();
//Dll3RV = Connect3(epdComsHandle, Epd, true);
}
DebugWrite("**** ReConnect rv {} v {}.{}.{}.{} ****\n", Dll3RV, HardVersion, HardVersionMinor, HardVersionBuild, HardVersionRevision );
}
@ -489,6 +528,7 @@ int Epd3Base::Epd3U::ReConnect()
if (Dll3RV) {
incrementError(Dll3RV);
}
else Sleep(100);
return Dll3RV;
}
@ -522,23 +562,9 @@ int Epd3Base::Epd3U::DisCon(UINT16 alarm)
}*/
SetFunctionReturnValue(fDisconnectAndNotify,0);
SetCommitReturnValue(0); SetEndReturnValue(Dll3RV);
#ifdef DEBUG
auto start = std::chrono::steady_clock::now();
#endif // DEBUG
Dll3RV = DisconnectAndNotify(epdComsHandle, EndNotifyAlarm, EndNotifyAlarmDuration); //1.0 secon
SetCommitReturnValue(0); SetEndReturnValue(Dll3RV);
#ifdef DEBUG
auto end = std::chrono::steady_clock::now();
// 4. Calculate duration
auto elapsed = end - start;
#endif // DEBUG
Sleep(1000);
} else {
@ -553,10 +579,11 @@ int Epd3Base::Epd3U::DisCon(UINT16 alarm)
Dll3RV = WaitForSingleObject(hCompletion, 3000);
switch (Dll3RV) {
case WAIT_OBJECT_0:
rv = 0; break;
case WAIT_TIMEOUT:
rv = 0;
current->CurrentDeviceID = 0;
current->CurrentDeviceID = 0; // when rv=0, this was set
current->DeviceCount = 0;
break;
default: rv = 3; break;
@ -573,7 +600,9 @@ void Epd3Base::Epd3U::CloseDev(bool CloseAll)
DisCon(0);
if (CloseAll) {
//CloseReader(epdComsHandle);
DestroyReaderInterface(epdComsHandle);
SetFunctionReturnValue(fDestroyReaderInterface, 0);
int Dll3RV = DestroyReaderInterface(epdComsHandle);
SetEndReturnValue(Dll3RV);
epdComsHandle = nullptr;
}
}
@ -611,11 +640,13 @@ void Epd3Base::Epd3U::DecodeStatus()
AlarmDoseHP07N = AlarmRateHP07N = AlarmDoseHP101G = AlarmDoseHP102G = AlarmRateHP101G = AlarmRateHP102G= 0;
hasAlarm = hasFault = false;
DetectorsOn = checkStatus(epd3status.OperatingStatus, OpStatusFlags::EpdOn);
EPDIssued = checkStatus(epd3status.OperatingStatus, OpStatusFlags::EpdIssued);
EPDLocked = checkStatus(epd3status.OperatingStatus, OpStatusFlags::GainAdjustable);
EPDTesting = checkStatus(epd3status.OperatingStatus, OpStatusFlags::DetectorTestRequested);
EPDDetectorTestRequested = checkStatus(epd3status.OperatingStatus, OpStatusFlags::DetectorTestRequested);
EPDFaulty = checkStatus(epd3status.FaultStatus, FaultStatusFlags::EpdFaulty);
EPDNewFault = checkStatus(epd3status.FaultStatus, FaultStatusFlags::ErrorLogged);
EPDComFault = checkStatus(epd3status.FaultStatus, FaultStatusFlags::EarlyCommsTermination);
@ -967,6 +998,7 @@ int Epd3Base::Epd3U::ConnectAndStatus(int tokenSourceTimeout)
Error = 0; ErrorStep = 0; hasAlarm = hasFault = 0;
ResetStepReturnValues();
sessionStart = std::chrono::steady_clock::now();
if (CommsInitialized == 0) StartCom();
if (CommsInitialized) {
@ -1501,7 +1533,7 @@ WORD Epd3Base::Epd3U::PrepareForIssue()
int rv = 0;
if (port == 0) return 0;
EPDStep = EpdSteps::StepPrepareIssue;
EPDStepResult = EpdStepResults::Started;
EPDSubStep = 1;
@ -1510,7 +1542,7 @@ WORD Epd3Base::Epd3U::PrepareForIssue()
//if (rv != 0) goto error; //non blocking on error
//rv = ReConnect();
}
EPDSubStep = 2;
@ -1536,7 +1568,7 @@ WORD Epd3Base::Epd3U::PrepareForIssue()
}
EPDSubStep = 3;
rv = ClearAlarms();
rv = ClearAlarms();
if (rv != 0) {
EPDStepResult = EpdStepResults::Error;
goto error;
@ -1551,14 +1583,26 @@ WORD Epd3Base::Epd3U::PrepareForIssue()
}
EPDSubStep = 5;
EPDStepResult = EpdStepResults::OK;
OutputDebugStringA("**** After clear ****\n");
if (isConnected && epdComsHandle) Disconnect(epdComsHandle);
isConnected = false;
if (progressCallback) progressCallback(EPDStep, EPDStepResult);
EPDStepResult = EpdStepResults::Sleeping;
if (progressCallback) {
progressCallback(EpdSteps::StepSleep, EpdStepResults::OK);
DebugWrite("**** After sleep callback\n");
}
Sleep(SleepAfterClear);
if (isConnected && epdComsHandle) {
SetFunctionReturnValue(fDisconnect, 1);
rv = Disconnect(epdComsHandle);
rv = SetEndReturnValue(rv);
}
isConnected = false;
EPDStepResult = EpdStepResults::OK;
if (progressCallback) {
progressCallback(EPDStep, EPDStepResult);
Sleep(100);
}
return rv;
error:
@ -2048,8 +2092,7 @@ int Epd3Base::Epd3U::IssueAndCheck(float gain, float ChirpRate)
rv = 1;
}*/
//rv1 = StepReturnValues[CurrentStep][1];
//rv2 = StepReturnValues[CurrentStep][2];
step = 3;
if (isNG) {

View file

@ -4,6 +4,8 @@
#pragma unmanaged
#include <windows.h>
#pragma unmanaged
#include <chrono>
#include "EpdCommon.h"
#include "Epd3.h"
#include "Epd2.h"
@ -78,7 +80,8 @@ namespace Epd3Base {
EnableProtectedSession,
fCreateReaderInterface,
fOpenReader,
TestVibe
TestVibe,
fConnect
};
@ -97,7 +100,8 @@ namespace Epd3Base {
const WORD MaxDevices = 10;
WORD DeviceCount = 0;
DWORD DeviceIDs[10];
int32_t StepReturnValues[MaxSteps][4];
int32_t StepReturnValues[MaxSteps][static_cast<size_t>(EpdStepColumns::maxStepColumn)]; //0=funct 1=rv commit 2=rv end 3=can ignore 4=ms start 5=ms end
int16_t errorm009 = 0; //error -9 r_OperationTimeout
int16_t errorm007 = 0; //error -7 r_InvalidState
int16_t errorm102 = 0; //error -102 r_InsufficientPriv
@ -105,6 +109,7 @@ namespace Epd3Base {
int16_t error_other = 0; //other errors
int CurrentStep;
BYTE HasStepError = 0;
std::chrono::time_point<std::chrono::steady_clock> sessionStart;
WORD WriteConfig32 = 1;
@ -165,6 +170,7 @@ namespace Epd3Base {
BYTE EPDProcSec = 0;
BYTE EPDFaulty = 0;
BYTE EPDTimeFault = 0;
BYTE EPDDetectorTestRequested;
//ErrorStatus

View file

@ -45,6 +45,10 @@ int EpdBaseClr::Epd2::GetSteps()
x->func = (Int32)epd3->StepReturnValues[i][0];
x->commitrv = epd3->StepReturnValues[i][1];
x->endrv = epd3->StepReturnValues[i][2];
x->commitms = epd3->StepReturnValues[i][4];
x->endms = epd3->StepReturnValues[i][5];
x->commitcode = epd3->StepReturnValues[i][6];
x->endcode = epd3->StepReturnValues[i][7];
StepReturnValues->Add(x);
}
}
@ -189,6 +193,7 @@ int EpdBaseClr::Epd2::DecodeStatus(Epd3Base::Epd3U* epd)
EPDProcSec = epd->EPDProcSec;
EPDFaulty = epd->EPDFaulty;
EPDTimeFault = epd->EPDTimeFault;
EPDDetectorTestRequested = epd->EPDDetectorTestRequested;
EPDNewFault = epd->EPDNewFault;
EPDComFault = epd->EPDComFault;
@ -226,6 +231,7 @@ int EpdBaseClr::Epd2::DecodeStatus(EpdBase::Epd2U* epd)
EPDProcSec = epd->EPDProcSec;
EPDFaulty = epd->EPDFaulty;
EPDTimeFault = 0;
EPDDetectorTestRequested = 0;
EPDNewFault = epd->EPDNewFault;
EPDComFault = epd->EPDComFault;
@ -280,6 +286,7 @@ int EpdBaseClr::Epd2::AfterGetStatus(EpdBase::Epd2U *epd)
otherAlarms = epd->OtherAlarms;
errorStatus = epd->ErrorStatus;
operatingStatus = epd->OperatingStatus;
EPDDetectorTestRequested = 0;
//hasAlarm = epd->hasAlarm; //?1
eDoshasAlarm = epd->hasAlarm;
eDosHasFault = epd->hasFault;
@ -313,7 +320,8 @@ int EpdBaseClr::Epd2::AfterGetStatus(Epd3Base::Epd3U* epd)
otherAlarms = (int)epd->OtherAlarms;
errorStatus = (int)epd->ErrorStatus;
operatingStatus = (int)epd->OperatingStatus;
EPDDetectorTestRequested = epd->EPDDetectorTestRequested;
eDoshasAlarm = epd->hasAlarm;
eDosHasFault = epd->hasFault;
EpdID = epd->EpdID;

View file

@ -33,6 +33,10 @@ namespace EpdBaseClr {
Int32 func;
Int32 commitrv;
Int32 endrv;
Int32 commitms;
Int32 endms;
Int32 commitcode;
int32_t endcode;
cStepValues();
~ cStepValues();
@ -42,7 +46,7 @@ namespace EpdBaseClr {
cStepValues:: cStepValues()
{
func = -1; commitrv = -1; endrv = -1;
func = -1; commitrv = -1; endrv = -1; commitms = -1; endms = -1; commitcode = 0; endcode = 0;
}
cStepValues::~ cStepValues()
@ -308,6 +312,7 @@ namespace EpdBaseClr {
BYTE EPDProcSec = 0;
BYTE EPDFaulty = 0;
BYTE EPDTimeFault = 0;
BYTE EPDDetectorTestRequested = 0;
//ERrrostatus
BYTE EPDNewFault = 0;

View file

@ -25,6 +25,7 @@ EXPORT_MANAGED enum class EpdSteps
StepPrepareIssue = 10,
StepIssue=11,
StepDeIssue=12,
StepSleep = 13,
};
@ -34,6 +35,22 @@ EXPORT_MANAGED enum class EpdStepResults
None=0,
Started=1,
OK=2,
Error
Error,
Sleeping
};
EXPORT_MANAGED enum class EpdStepColumns
{
function,
commitRV,
endRV,
canIgnorore,
commitMS,
endMS,
commitCode,
endCode,
maxStepColumn
};
};

View file

@ -21,7 +21,7 @@ Set-AuthenticodeSignature -FilePath "$ScriptPath\Upgrader.ps1" -Certificate $cer
Set-AuthenticodeSignature -FilePath "$ScriptPath\Downgrader.ps1" -Certificate $cert -TimestampServer "http://timestamp.digicert.com"
Set-AuthenticodeSignature -FilePath "$ScriptPath\installatie.ps1" -Certificate $cert -TimestampServer "http://timestamp.digicert.com"
Set-AuthenticodeSignature -FilePath "$ScriptPath\installatie2.ps1" -Certificate $cert -TimestampServer "http://timestamp.digicert.com"
Set-AuthenticodeSignature -FilePath "$ScriptPath\UpdateSql.ps1" -Certificate $cert -TimestampServer "http://timestamp.digicert.com"
compress-archive -force -Path "$SourcePath\syncEdosLocal\bin\Release\*.*" -DestinationPath "$DestPath\eDosSync.zip"
compress-archive -force -Path "$SourcePath\eDosStation\bin\Release\*.*" -DestinationPath "$DestPath\eDosStation.zip"
@ -30,22 +30,24 @@ compress-archive -force -Path "$SourcePath\eDosStation\bin\Release\*.*" -Desti
Copy-Item -Path "$ScriptPath\*.cmd" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\ConfigurationFile.ini" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\eDosStation.pub" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\authorized_keys" -Destination "$DestPath\authorized_keys"
Copy-Item -Path "$ScriptPath\Upgrader.ps1" -Destination "$DestPath\Upgrader.ps1"
Copy-Item -Path "$ScriptPath\Downgrader.ps1" -Destination "$DestPath\Downgrader.ps1"
Copy-Item -Path "$ScriptPath\installatie.ps1" -Destination "$DestPath\installatie.ps1"
Copy-Item -Path "$ScriptPath\installatie2.ps1" -Destination "$DestPath\installatie2.ps1"
Copy-Item -Path "$ScriptPath\authorized_keys" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\Upgrader.ps1" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\Downgrader.ps1" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\installatie.ps1" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\installatie2.ps1" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\UpdateSql.ps1" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\UpdateSql.cmd" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\eDosSync.xml" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\*.cer" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\UpdateSql.cmd" -Destination "$DestPath"
Copy-Item -Path "$ScriptPath\sqlreg.reg" -Destination "$DestPath"
#nodig ?
Copy-Item -Path "$ScriptPath\*.sql" -Destination "$DestPath"
Copy-Item -Path "$SourcePath\eDosLocal\SqlUpdates\*.sql" -Destination "$DestPath\SqlUpdates"
#updates
Copy-Item -Path "$SourcePath\eDosLocal\UpdateLocal.sql" -Destination "$DestPath\UpdateLocal.sql"

View file

View file

@ -578,3 +578,8 @@ GO
GRANT EXECUTE ON [GetPersonOverview] TO [edosstation];
GO
CREATE table [dbo].[DatabaseVersion] (VersionNumber INT NOT NULL, VersionDate DATETIME NOT NULL, Description NVARCHAR(200) NULL);
GO
INSERT [dbo].[DatabaseVersion] (VersionNumber, VersionDate, Description) VALUES (1, GETDATE(), 'Initial version');
GO

View file

@ -47,6 +47,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{065B
scripts\UpdateLocal.sql = scripts\UpdateLocal.sql
scripts\Updates.sql = scripts\Updates.sql
scripts\UpdateSql.cmd = scripts\UpdateSql.cmd
scripts\UpdateSql.ps1 = scripts\UpdateSql.ps1
scripts\Upgrader.ps1 = scripts\Upgrader.ps1
scripts\VC_redist.x64.exe = scripts\VC_redist.x64.exe
scripts\VC_redist.x86.exe = scripts\VC_redist.x86.exe

View file

@ -61,7 +61,8 @@ namespace eDosStation
"EnableProtectedSession",
"fCreateReaderInterface",
"fOpenReader",
"TestVibe"
"TestVibe",
"fConnect"
};
private static string GetName(int func)
@ -103,6 +104,7 @@ namespace eDosStation
case -201: rv = "r_ErrorNotProcessed"; break; //command not processed due to previous failure
case -202: rv = "r_ErrorNotConnected"; break;
case -203: rv = "r_ErrorUserCancelled"; break;
case -998: rv = "N/A"; break;
case -999: rv = "r_Other"; break;
default: rv = rval.ToString(); break;
}
@ -119,8 +121,10 @@ namespace eDosStation
sb.Append(GetName(Lst[s].func));
sb.Append(": commit : ");
sb.Append(Getresult(Lst[s].commitrv));
sb.Append(Lst[s].commitms.ToString());
sb.Append(": End : ");
sb.AppendLine(Getresult(Lst[s].endrv));
sb.Append(Lst[s].endms.ToString());
}
return sb.ToString();
}
@ -132,8 +136,8 @@ namespace eDosStation
if (Lst != null && Lst.Count > 0)
for (int s = 0; s < Lst.Count; s++)
{
string msg = $"{s} {GetName(Lst[s].func)} commit: {Getresult(Lst[s].commitrv)} end : {Getresult(Lst[s].endrv)} ({Lst[s].endrv})";
spl?.WriteSplunkLog(module, null, Lst[s].commitrv == 0 && Lst[s].endrv == 0 ? cspl.iseverity.info : cspl.iseverity.err, msg);
string msg = $"{s} {GetName(Lst[s].func)} commit: {Getresult(Lst[s].commitrv)} ({Lst[s].commitms} ms) (er {Lst[s].commitcode} ) / end : {Getresult(Lst[s].endrv)} ({Lst[s].endms} ms) (er {Lst[s].endcode} )";
spl?.WriteSplunkLog(module, null,(Lst[s].commitrv == 0 || Lst[s].commitrv == -998 )&& Lst[s].endrv == 0 ? cspl.iseverity.info : cspl.iseverity.err, msg);
}
}

View file

@ -387,7 +387,9 @@
<telerik:RadStepProgressBarItem Content="Open" />
<telerik:RadStepProgressBarItem Content="Connect" />
<telerik:RadStepProgressBarItem Content="Status" />
<telerik:RadStepProgressBarItem Content="Issue" />
<telerik:RadStepProgressBarItem Content="Sleep" />
<telerik:RadStepProgressBarItem Content="Clear" />
<telerik:RadStepProgressBarItem Content="Issued" />
</telerik:RadStepProgressBar>
</Grid>
</TabItem>

View file

@ -130,7 +130,7 @@ namespace eDosStation
bool stopBecauseAlarmDose = ep.eDoshasAlarm && thisStation.StopBecauseAlarmDose ;
if (stopBecauseAlarmDose || ep.OtherAlarmBatLow > 0 || realFault )
if (stopBecauseAlarmDose || ep.OtherAlarmBatLow > 0 || realFault || ep.EPDDetectorTestRequested > 0)
{
TextBlock il = new TextBlock();
il.Inlines.Add(new Run("EPD is in alarm status\n\n")
@ -146,6 +146,7 @@ namespace eDosStation
if (ep.EPDComFault > 0) il.Inlines.Add(new Run("* Communication fault *"));
if (ep.EPDEprFault > 0) il.Inlines.Add(new Run("* Eprom fault *"));
if (ep.EPDTrhFault > 0) il.Inlines.Add(new Run("* Treshold fault *"));
if (ep.EPDDetectorTestRequested > 0) il.Inlines.Add(new Run("* Detector test requested *"));
il.Inlines.Add(new LineBreak());
il.Inlines.Add(new LineBreak());
il.Inlines.Add(new Run("Please take an other."));
@ -1053,19 +1054,23 @@ namespace eDosStation
System.Diagnostics.Debug.WriteLine($"EPD Progress step:{step} result:{result}");
int index = -1;
StepStatus st = StepStatus.NotStarted;
System.Windows.Media.Brush br = System.Windows.Media.Brushes.LightGray;
switch (step)
{
case EpdSteps.StepStartCom: index = 0; break;
case EpdSteps.StepConnecting: index = 1; break;
case EpdSteps.StepReadStatus: index = 2; break;
case EpdSteps.StepPrepareIssue: index = 3; break;
case EpdSteps.StepSleep: index = 3; break;
case EpdSteps.StepPrepareIssue: index = 4; break;
case EpdSteps.StepIssue: index = 5; break;
}
switch (result)
{
case EpdStepResults.OK: st = StepStatus.Completed; break;
case EpdStepResults.Error: st = StepStatus.Indeterminate ; break;
case EpdStepResults.Started: st = StepStatus.Indeterminate ; break;
case EpdStepResults.OK: st = StepStatus.Completed; br = System.Windows.Media.Brushes.LightGreen; break;
case EpdStepResults.Error: st = StepStatus.Indeterminate ; br = System.Windows.Media.Brushes.LightGreen; break;
case EpdStepResults.Started: st = StepStatus.Indeterminate ; br = System.Windows.Media.Brushes.LightYellow; break;
case EpdStepResults.Sleeping: st = StepStatus.Indeterminate; br = System.Windows.Media.Brushes.LightBlue; break;
}
if (index >= 0 && index < stepEPD.Items.Count)
{
@ -1073,13 +1078,12 @@ namespace eDosStation
{
stepEPD.SelectedIndex = index;
stepEPD.SelectedItemStatus = st;
// Optional: Force the progress step visual item to update status if needed
if (stepEPD.ItemContainerGenerator.ContainerFromIndex(index) is FrameworkElement container)
stepEPD.Background = br;
if (stepEPD.ItemContainerGenerator.ContainerFromIndex(index) is FrameworkElement container)
{
container.UpdateLayout();
}
}, System.Windows.Threading.DispatcherPriority.Normal);
}, System.Windows.Threading.DispatcherPriority.Send);
}
}

View file

@ -1 +1 @@
03/09/2026 13:12:23,94
04/09/2026 20:18:51,19

View file

@ -1,4 +1,4 @@
echo "start Powershell as admin"
echo "start Powershell as admin"
Set-ExecutionPolicy -ExecutionPolicy unrestricted

View file

@ -156,25 +156,25 @@ exit
# FLFk43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAvjSabnf7+Pu0VrFgoiovRDiyx
# 3zEdmcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3JE3rYkrhLULy7Dc90G6e8Blqm
# yIjlgp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM1pD2T7m3XDCCBu0wggTVoAMC
# AQICEAqA7xhLjfEFgtHEdqeVdGgwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMC
# AQICEAhP3DNPfkVO28MPj/mSGDUwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMC
# VVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBU
# cnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMTAe
# Fw0yNTA2MDQwMDAwMDBaFw0zNjA5MDMyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# Fw0yNjA4MDUwMDAwMDBaFw0zNzExMDQyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgU0hBMjU2
# IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI1IDEwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQDQRqwtEsae0OquYFazK1e6b1H/hnAKAd/KN8wZ
# QjBjMqiZ3xTWcfsLwOvRxUwXcGx8AUjni6bz52fGTfr6PHRNv6T7zsf1Y/E3IU8k
# gNkeECqVQ+3bzWYesFtkepErvUSbf+EIYLkrLKd6qJnuzK8Vcn0DvbDMemQFoxQ2
# Dsw4vEjoT1FpS54dNApZfKY61HAldytxNM89PZXUP/5wWWURK+IfxiOg8W9lKMqz
# dIo7VA1R0V3Zp3DjjANwqAf4lEkTlCDQ0/fKJLKLkzGBTpx6EYevvOi7XOc4zyh1
# uSqgr6UnbksIcFJqLbkIXIPbcNmA98Oskkkrvt6lPAw/p4oDSRZreiwB7x9ykrjS
# 6GS3NR39iTTFS+ENTqW8m6THuOmHHjQNC3zbJ6nJ6SXiLSvw4Smz8U07hqF+8CTX
# aETkVWz0dVVZw7knh1WZXOLHgDvundrAtuvz0D3T+dYaNcwafsVCGZKUhQPL1naF
# KBy1p6llN3QgshRta6Eq4B40h5avMcpi54wm0i2ePZD5pPIssoszQyF4//3DoK2O
# 65Uck5Wggn8O2klETsJ7u8xEehGifgJYi+6I03UuT1j7FnrqVrOzaQoVJOeeStPe
# ldYRNMmSF3voIgMFtNGh86w3ISHNm0IaadCKCkUe2LnwJKa8TIlwCUNVwppwn4D3
# /Pt5pwIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU5Dv88jHt
# /f3X85FxYxlQQ89hjOgwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04w
# IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI2IDEwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQC2e6byyf7NSvjUm0xls/04xjD4fAkOkbnGQi7+
# Wpx81iYxfzViaxSIctuH3KSl5YEYpMuFgGsA31N2D9ATMbfZdw5uaAhuWevQKhDd
# ZIB4NnqcfpfpWQXJiQnDdAElETC+bhSEvNLGbA8DtwUpFMQ4yyYQSPqomT92osQA
# v6hBi47ATZS6JfVWe6XxhF4jJZ3iSAuf2Cros1czRSmWRHqMv9AfGZvp8ygYElhu
# dpQjtcPpwoOl6QrZJUyV3iINvN4cO05prGV0fkjG426xDr2d3z9lcSIHkdvGPdGU
# rXdxfVbgOUVcp2/8ISEzwKPW++Wa+E2ujI91EZtukGWDJ/xZ27k3oHKEXBRGfRTq
# jOU+jE3ba/5++JSE/7oNHnjs5mekExYN96LV/mxUbCKJb8pBNY4r3uD7hEmk/M81
# XhVgwDA7aMzYC3LZBg9WY5BMmbSay5ecmtJuXaB/0nKWmQmVZeqTVDgsmzHP5MQu
# hAJkiWNuC9MmCg9TZHXbJ2/yLVSov9p16UDTLtT0+aa1vN71fHeu1qMLlLNB3WOB
# /ADCxr3S/1hxI92Z6jKgEED/btwIvbfuXkNNhg8MtDg43c4tMZae9FvqMOt/9Pvm
# AxF9TNIsIFB8G6yb36ZJZGUL8N/pL971DyLXcK6HM5PYnH5X+eVtczhCgHCVQCF6
# XDAlPQIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUFMljijAu
# 1Er7bpTz5uNAfvXszeIwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04w
# DgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMIGVBggrBgEF
# BQcBAQSBiDCBhTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t
# MF0GCCsGAQUFBzAChlFodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl
@ -182,17 +182,17 @@ exit
# XwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lD
# ZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEuY3Js
# MCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsF
# AAOCAgEAZSqt8RwnBLmuYEHs0QhEnmNAciH45PYiT9s1i6UKtW+FERp8FgXRGQ/Y
# AavXzWjZhY+hIfP2JkQ38U+wtJPBVBajYfrbIYG+Dui4I4PCvHpQuPqFgqp1PzC/
# ZRX4pvP/ciZmUnthfAEP1HShTrY+2DE5qjzvZs7JIIgt0GCFD9ktx0LxxtRQ7vll
# KluHWiKk6FxRPyUPxAAYH2Vy1lNM4kzekd8oEARzFAWgeW3az2xejEWLNN4eKGxD
# J8WDl/FQUSntbjZ80FU3i54tpx5F/0Kr15zW/mJAxZMVBrTE2oi0fcI8VMbtoRAm
# aaslNXdCG1+lqvP4FbrQ6IwSBXkZagHLhFU9HCrG/syTRLLhAezu/3Lr00GrJzPQ
# FnCEH1Y58678IgmfORBPC1JKkYaEt2OdDh4GmO0/5cHelAK2/gTlQJINqDr6Jfwy
# YHXSd+V08X1JUPvB4ILfJdmL+66Gp3CSBXG6IwXMZUXBhtCyIaehr0XkBoDIGMUG
# 1dUtwq1qmcwbdUfcSYCn+OwncVUXf53VJUNOaMWMts0VlRYxe5nK+At+DI96HAlX
# HAL5SlfYxJ7La54i71McVWRP66bW+yERNpbJCjyCYG2j+bdpxo/1Cy4uPcU3AWVP
# Grbn5PhDBf3Froguzzhk++ami+r3Qrx5bIbY3TVzgiFI7Gq3zWcxggU2MIIFMgIB
# AAOCAgEAjcU6YR6dUgrfmawJgH59KECxa9Ji8sEi2g10CBDaMiqsaxWyW5cwlT/6
# ZF5sFznazqVsoC85U9dqLOYqQwst+UQQoNlDHgKRLa3xoc+OReFreFhnTXSG0Vrd
# 2E2CZqUfm+5a+He1MJ/h+tNLuA+0Zzhn/Fo+FDYAHWZHx4R79ZsfRFYe9UiXpXBD
# f6DkUo183Y38NYmR/XfDYf7YZ+oR9t3flbDwK+hgGMs0gNNp1w9Z2CyOyI5or/sS
# womAuNQ0hWC9xoU4stD8aWsD7RkcmgVRs6vlIk3zPKQ+ylcheWkMlj+CoVRlFE55
# pv0ZWCaFt04lwP/rdGHE9qEVQZtyRE42ox7oNgC/r+Y4bSlZ3dw9K2x1xLtu6PkP
# KeLBFjzKigwfqm3Hm+k/+lnME8F5kPZTgiy2HLEHklpryqs6QHnPXrRNeIzkAMyy
# lnRN8P0wmirS0WkU+ywpEWFZ4QNg+9xS43tTuW9x0eXh7NDc1P/sV+zWxHXKH8tF
# t1ncHdVzqrZaYPyYMLSn2TOXajveJW1L3joiQSPsWRGxkbDDW15jERFE4LvjnGu2
# O9zD1nLJSMdlYZEikl4w2w+q4IN/R+TIe0H4ngCI1moJCTbevGH4punIxM1Uoi0n
# mX3ZK+XbRT01uowE5ViXWHng0RgsmrX/EdYUo80r3TfMlkD0/YMxggU2MIIFMgIB
# ATBrMGYxCzAJBgNVBAYTAkJFMRIwEAYDVQQIEwlBbnR3ZXJwZW4xDDAKBgNVBAcT
# A01vbDEPMA0GA1UEChMGU0NLQ0VOMQwwCgYDVQQLEwNJQ1QxFjAUBgNVBAMTDVND
# S0NFTiBJQ1QgQ0ECAR8wCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKA
@ -206,19 +206,19 @@ exit
# c//mk/kFA69lGuYJp2wnXIN1yF6O9ynORt2Fec3JpNcZwNnvERyhggMmMIIDIgYJ
# KoZIhvcNAQkGMYIDEzCCAw8CAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAKgO8YS43xBYLRxHan
# lXRoMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTAzMTExMjUyWjAvBgkqhkiG9w0BCQQxIgQgwGts
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAIT9wzT35FTtvDD4/5
# khg1MA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTA0MTY1MDU1WjAvBgkqhkiG9w0BCQQxIgQgwGts
# hmgwg+1No3Bfq4IiEmxiCsjb9Jy7A/l9sT7ewm0wDQYJKoZIhvcNAQEBBQAEggIA
# NuNcTJaodoszSWkFpEdBJlem+R1QClcLkL7+stSu6oKixILsaiUl98LQu0xARXr2
# uQlqGgz1jGYtCAUftA3+9eGv5pM2ipddSCQQDwtg1CZix2liuiYObDomCFhtr7A0
# 1HdwN5hzJQnv2tP5WAK/OmG/qUXSjOOI5Xf/nfkIOYYfeZj1mqee079O55az9oto
# SIspIow+bzddzCuWYknBSgoSAfjdnWhV227RurIXvp6Ab63AmyK6d8D4CS1Oio2A
# suCpFbFStx9fncwH8P/HJzYyqB5Ql+yBg0CbGfD64tnRk4A1VRCgUJV7YTtXNupf
# y3tApn/BpMVMo7/nWawcwKQLeDfoGWqlBDwEhjlDlsmLxrzaOeY+GlZvmZIbi4aj
# /JDHYwFKUCNxtsOMFiiM7KWFxcLKV53j0TGMsWDz1aRsG/wakdXT2CvhuaF/G1L2
# GwAy6r66hpgNjNO27bOjIDExGyswUFNQDofvGnL1ytzjCN3Fbj3D5KOy9JfyrRfe
# XPTP/SCDK4FyuHlV9mxuZUOyo0bsGvJ6c45jgzQpha0PNU1EmQLsohAiq37WHM6h
# umZIXA5Y/JcMICArf5Dok9WeIawsMlFxmsJaS20nI32pbZn0/yy9NJlneAkPQBXX
# m5NTSgK8f3m3AulzQnxViSeIC72pNnjz15opKFLhafQ=
# jSiQUwO5JrgprEN1ObNTpnCZM2Jk1PkawAN6zt2Y8NAAvzENeyBmpb5oBZ4QpSpi
# SIWCvxbEL2G9GzVd7/aQtC68QFFqAEQ8kRoCAZ3qsfwojUevEZQ4QP64/K75OBiN
# A4Gvqhz1EdCY0xijnkoxVtl4bj2PJXSuC+Cf/aAr57KRvBKEzkAPSlIAmF7Vub2p
# Ez6lw+RVzgV80DI75YEYgzMuIgTZV+nSoDIXPPJnxPlVNB7vLv/eXaNa7rb8HoRt
# KvTh2oJEVLMExNtwwbX6KFig71vM0K3KH2IQBWKSGis1vZL2EryDWetp2ltLsFvH
# WYPkhsSx6CUGBxgD+aCxi0qLAFrWmX1CLl2quQTVs/c1N0XiwNW09+cjiLwBmquP
# ql6+bYC5Fqh8nNTesbciZv6IxagCMKS0B7oeU/98CsjVGo66Ap1fNBHgPqpWSi0p
# D2JQUtO5NMrGpj91ayLRQf5LzH+JBtdmaPs4xmOwXwJbgzOpDmG8VpDLiGdxBlfy
# XUAulaIRMAGuGb2e+Umbqbwvac49+k38kKx4i0tQqkYG0+xj6qs6aP9BPnwQBeQO
# +RlMkQe1cqAzRlRxx+KBZxxLUTRDay98Kt13O4J5oO7i4R4NLjFmmYlKtpd5B3TA
# Lsc2PkyFe5OZ5ZPTdteK/ygxtxPoEhMpDUIony76/DU=
# SIG # End signature block

View file

@ -1,531 +0,0 @@
USE [eDosLocal];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
IF NOT EXISTS (SELECT * FROM sys.columns WHERE OBJECT_ID=OBJECT_ID('dbo.visit') AND name='eDosBatteryWarning')
begin
ALTER TABLE [dbo].[Visit] ADD eDosBatteryWarning BIT null;
ALTER TABLE [dbo].[Visit] ADD eDosDose07Warning BIT null;
ALTER TABLE [dbo].[Visit] ADD eDosDose07Alarm BIT null;
ALTER TABLE [dbo].[Visit] ADD eDosRate07Warning BIT null;
ALTER TABLE [dbo].[Visit] ADD eDosRate07Alarm BIT null;
ALTER TABLE [dbo].[Visit] ADD eDosDose10Warning BIT null;
ALTER TABLE [dbo].[Visit] ADD eDosDose10Alarm BIT null;
ALTER TABLE [dbo].[Visit] ADD eDosRate10Warning BIT null;
ALTER TABLE [dbo].[Visit] ADD eDosRate10Alarm BIT null;
END
IF NOT EXISTS (SELECT * FROM [sys].[columns] WHERE [object_id] = OBJECT_ID('dbo.visit') AND [name] = 'isFault')
BEGIN
ALTER TABLE [dbo].[Visit] ADD [isFault] BIT NULL;
END;
GO
IF OBJECT_ID('dbo.PersonAlarms') IS NULL BEGIN
CREATE TABLE [dbo].[PersonAlarms] ([PersID] INT NOT NULL,
[VisitTime] DATETIME NOT NULL,
[ID_Station] INT NOT NULL,
[ID_Visit] INT NOT NULL,
PRIMARY KEY NONCLUSTERED([PersID], [VisitTime]));
END;
GO
ALTER PROCEDURE [dbo].[VisitExit] @EPDVisitID INT,
@HP07 FLOAT,
@HP10 FLOAT,
@HP07Peak FLOAT,
@HP10Peak FLOAT,
@HP07PeakTime DATETIME = NULL,
@HP10PeakTime DATETIME = NULL,
@HP07Total FLOAT,
@HP10Total FLOAT,
@K1 INT,
@K2 INT,
@K3 INT,
@K4 INT,
@K5 INT = NULL,
@K6 INT = NULL,
@SG INT,
@BC INT,
@FB INT,
@HG INT,
@QualityData INT,
@alarmStatus INT,
@otherAlarms INT,
@errorStatus INT,
@operatingStatus INT,
@ENTRY_EPD_CLOCK DECIMAL(10, 0) NULL,
@EXIT_EPD_CLOCK DECIMAL(10, 0) NULL,
@PersID INT = NULL,
@eDosBatteryWarning BIT = NULL,
@eDosDose07Warning BIT = NULL,
@eDosDose07Alarm BIT = NULL,
@eDosRate07Warning BIT = NULL,
@eDosRate07Alarm BIT = NULL,
@eDosDose10Warning BIT = NULL,
@eDosDose10Alarm BIT = NULL,
@eDosRate10Warning BIT = NULL,
@eDosRate10Alarm BIT = NULL,
@isAlarm BIT = NULL,
@isFault BIT = NULL
AS BEGIN
DECLARE
@ID_Visit INT,
@ID_Station INT,
@ID_Station_Return INT;
SET @ID_Station = @EPDVisitID % 100;
SET @ID_Visit = @EPDVisitID / 100;
IF @isAlarm IS NULL
SET @isAlarm = CASE WHEN ISNULL(@alarmStatus, 0) <> 0
OR (ISNULL(@otherAlarms, 0) & 0x7f) <> 0 --bit 7=battery low
OR ISNULL(@eDosDose07Warning, 0) <> 0
OR ISNULL(@eDosRate07Warning, 0) <> 0
OR ISNULL(@eDosDose10Warning, 0) <> 0
OR ISNULL(@eDosRate10Warning, 0) <> 0
OR ISNULL(@eDosDose07Alarm, 0) <> 0
OR ISNULL(@eDosRate07Alarm, 0) <> 0
OR ISNULL(@eDosDose10Alarm, 0) <> 0
OR ISNULL(@eDosRate10Alarm, 0) <> 0 THEN 1 ELSE 0 END;
DECLARE @Now DATETIME = GETDATE();
IF @ID_Station_Return IS NULL
SELECT
@ID_Station_Return = [ID_Station]
FROM [dbo].[StationSettings]
WHERE [PCNr] = HOST_NAME();
DECLARE @isComplete BIT = 1;
IF NOT EXISTS (SELECT
*
FROM [dbo].[Visit]
WHERE [ID_Visit] = @ID_Visit
AND [ID_Station] = @ID_Station)BEGIN
SET @isComplete = 0;
INSERT [dbo].[Visit]([ID_Station], [ID_Visit], [Inst_CODE], [isManualExit], [isDeleted], [ID_Station_Return], [isComplete], [ENTRY_EPD_CLOCK], [PersID])
VALUES(@ID_Station, @ID_Visit, 0, 0, 0, @ID_Station_Return, 0, @ENTRY_EPD_CLOCK, @PersID);
END;
UPDATE
[dbo].[Visit]
SET
[Hp07Dose] = @HP07,
[Hp10Dose] = @HP10,
[isComplete] = @isComplete,
[ReturnTime] = @Now,
[Hp07Peak] = @HP07Peak,
[Hp10Peak] = @HP10Peak,
[Hp07Time] = @HP07PeakTime,
[Hp10Time] = @HP10PeakTime,
[Hp07Total] = @HP07Total,
[Hp10Total] = @HP10Total,
[K1] = @K1,
[K2] = @K2,
[K3] = @K3,
[K4] = @K4,
[K5] = @K5,
[K6] = @K6,
[SG] = @SG,
[BC] = @BC,
[FB] = @FB,
[HG] = @HG,
[QualityData] = @QualityData,
[alarmStatus] = @alarmStatus,
[otherAlarms] = @otherAlarms,
[errorStatus] = @errorStatus,
[operatingStatus] = @operatingStatus,
--[D1] = @D1, [D2] = @D2, [D3] = @D3, [D4] = @D4,
[isAlarm] = @isAlarm,
[isManualExit] = 0,
[ID_Station_Return] = @ID_Station_Return,
[ENTRY_EPD_CLOCK] = @ENTRY_EPD_CLOCK,
[EXIT_EPD_CLOCK] = @EXIT_EPD_CLOCK,
[PersID] = CASE WHEN [PersID] IS NULL THEN @PersID ELSE [PersID] END,
[eDosBatteryWarning] = @eDosBatteryWarning,
[eDosDose07Warning] = @eDosDose07Warning,
[eDosDose07Alarm] = @eDosDose07Alarm,
[eDosRate07Warning] = @eDosRate07Warning,
[eDosRate07Alarm] = @eDosRate07Alarm,
[eDosDose10Warning] = @eDosDose10Warning,
[eDosDose10Alarm] = @eDosDose10Alarm,
[eDosRate10Warning] = @eDosRate10Warning,
[eDosRate10Alarm] = @eDosRate10Alarm,
[isFault] = @isFault
WHERE [ID_Visit] = @ID_Visit
AND [ID_Station] = @ID_Station;
-- local- >PersonInfoSnapshot
IF @isAlarm = 1 BEGIN
IF @PersID IS NULL
SELECT
@PersID = [PersID]
FROM [dbo].[Visit]
WHERE [ID_Visit] = @ID_Visit
AND [ID_Station] = @ID_Station;
UPDATE
[dbo].[PersonInfoSnapshot]
SET
[VisitIDLocked] = @ID_Visit * 100 + @ID_Station
WHERE [PersID] = @PersID;
IF NOT EXISTS (SELECT
*
FROM [dbo].[PersonAlarms]
WHERE [PersID] = @PersID
AND [VisitTime] = @Now)
INSERT [dbo].[PersonAlarms]([PersID], [VisitTime], [ID_Station], [ID_Visit])
VALUES(@PersID, @Now, @ID_Station, @ID_Visit);
END;
END;
GO
ALTER PROCEDURE [export].[VisitsSelect]
AS
SELECT
[ID_Station],
[ID_Visit],
[Inst_CODE],
[PersID],
[ID_Task],
[EntryTime],
[ReturnTime],
[Hp10Dose],
[Hp07Dose],
[Hp10Total],
[Hp07Total],
[Hp10Peak],
[Hp07Peak],
[Hp10Time],
[Hp07Time],
[ID_EPD],
[QualityData],
[K1],
[K2],
[K3],
[K4],
[K5],
[K6],
[SG],
[BC],
[FB],
[HG],
[alarmStatus],
[otherAlarms],
[errorStatus],
[operatingStatus],
[isBG],
[isComplete],
[isDeleted],
[isAlarm],
[isAlarmCleared],
[isManualExit],
[ID_Station_Return],
[ENTRY_EPD_CLOCK],
[EXIT_EPD_CLOCK],
[TIME_LOST],
[VisitStatus] = CONVERT(TINYINT, CASE WHEN [EntryTime] IS NOT NULL
AND [ReturnTime] IS NOT NULL THEN 3
WHEN [EntryTime] IS NOT NULL THEN 1
WHEN [ReturnTime] IS NOT NULL THEN 2 ELSE 0 END),
[syncedEntry],
[syncedExit],
[epdType],
[epdID],
[eDosBatteryWarning],
[eDosDose07Warning],
[eDosDose07Alarm],
[eDosRate07Warning],
[eDosRate07Alarm],
[eDosDose10Warning],
[eDosDose10Alarm],
[eDosRate10Warning],
[eDosRate10Alarm]
FROM [dbo].[Visit]
WHERE([syncedEntry] = 0 OR [syncedExit] = 0);
GO
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id=OBJECT_ID('[dbo].[StationSettings]') AND name='RestartComFirst')
begin
ALTER TABLE [dbo].[StationSettings] ADD [RestartComFirst] BIT;
ALTER TABLE [dbo].[StationSettings] ADD [OnlyMK2] BIT;
END
GO
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id=OBJECT_ID('[dbo].[StationSettings]') AND name='AllowMultipleEPD')
ALTER TABLE [dbo].[StationSettings] ADD AllowMultipleEPD BIT NULL;
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id=OBJECT_ID('[dbo].[StationSettings]') AND name='EPDRetries')
ALTER TABLE [dbo].[StationSettings] ADD EPDRetries INT NULL;
IF EXISTS (SELECT * FROM sys.columns WHERE object_id=OBJECT_ID('[dbo].[StationSettings]') AND name='EPDRetries' AND [system_type_id]<>56)
ALTER TABLE [dbo].[StationSettings] ALTER COLUMN [EPDREtries] int
GO
ALTER PROCEDURE [dbo].[StationSettingsSelect] AS
SELECT
[ID_Station],
[PCNr],
[ComPort],
[Inst_CODE1],
[Inst_CODE2],
[Inst_Name1],
[Inst_Name2],
[TestCSN],
[Reader],
[useTestButtons] = ISNULL([useTestButtons], 0),
[useBeep] = ISNULL([useBeep], 22),
[checkUser] = ISNULL([checkUser], 0),
[EPDTimeout] = ISNULL([EPDTimeout], 10000),
[EPDRetries] = ISNULL([EPDREtries], 1),
[RestartCom] = ISNULL([RestartCom], 0),
[RestartComFirst] = ISNULL([RestartComFirst], 0),
[OnlyMK2] = ISNULL([OnlyMK2], 0),
[AllowMultipleEPD] = ISNULL([AllowMultipleEPD], 0)
FROM [dbo].[StationSettings]
WHERE [PCNr] = HOST_NAME();
GO
ALTER PROCEDURE [dbo].[StationSettingsUpdate] @ComPort INT = NULL,
@Inst_CODE1 INT = NULL,
@Inst_CODE2 INT = NULL,
@Inst_Name1 VARCHAR(50) = NULL,
@Inst_Name2 VARCHAR(50) = NULL,
@TestCSN VARCHAR(50) = NULL,
@Reader VARCHAR(70) = NULL,
@useTestButtons BIT = 0,
@useBeep TINYINT = 22,
@checkUser BIT = 0,
@EPDTimeout INT = 10000,
@EPDRetries INT = 1,
@RestartCom BIT = 0,
@RestartComFirst BIT = 0,
@OnlyMK2 BIT = 0,
@AllowMultipleEPD BIT = 0
AS
IF NOT EXISTS (SELECT * FROM [dbo].[StationSettings] WHERE [PCNr] = HOST_NAME())
INSERT [dbo].[StationSettings]([PCNr], [ComPort], [Inst_CODE1], [Inst_CODE2], [Inst_Name1], [Inst_Name2], [TestCSN], [Reader], [useTestButtons], [useBeep], [checkUser], [EPDREtries], [RestartCom], [RestartComFirst], [OnlyMK2], [AllowMultipleEPD])
VALUES(HOST_NAME(), @ComPort, @Inst_CODE1, @Inst_CODE2, @Inst_Name1, @Inst_Name2, @TestCSN, @Reader, @useTestButtons, @useBeep, @checkUser, @EPDRetries, @RestartCom, @RestartComFirst, @OnlyMK2, @AllowMultipleEPD);
ELSE
UPDATE
[dbo].[StationSettings]
SET
[ComPort] = @ComPort,
[Inst_CODE1] = @Inst_CODE1,
[Inst_CODE2] = @Inst_CODE2,
[Inst_Name1] = @Inst_Name1,
[Inst_Name2] = @Inst_Name2,
[TestCSN] = @TestCSN,
[Reader] = @Reader,
[useTestButtons] = @useTestButtons,
[useBeep] = @useBeep,
[checkUser] = @checkUser,
[EPDTimeout] = @EPDTimeout,
[EPDREtries] = @EPDRetries,
[RestartCom] = @RestartCom,
[RestartComFirst] = @RestartComFirst,
[OnlyMK2] = @OnlyMK2,
[AllowMultipleEPD]=@AllowMultipleEPD
WHERE [PCNr] = HOST_NAME();
go
CREATE OR ALTER PROCEDURE [dbo].[VisitInfo] @EPDVisitID INT = 51905,
@hasExited BIT = 0 OUT,
@isManualExit BIT = 0 OUT,
@name VARCHAR(100) = NULL OUT
AS
--DECLARE @EPDVisitID INT= 51905
BEGIN
SET NOCOUNT ON;
DECLARE
@ID_Visit INT,
@ID_Station INT,
@PersID INT;
SET @ID_Station = @EPDVisitID % 100;
SET @ID_Visit = @EPDVisitID / 100;
SET @hasExited = 0;
SET @isManualExit = 0;
SELECT
@hasExited = CONVERT(BIT, CASE WHEN [ReturnTime] IS NOT NULL OR [isManualExit] = 1 THEN 1 ELSE 0 END),
@isManualExit = ISNULL([isManualExit], 0),
@PersID = @PersID
FROM [dbo].[Visit]
WHERE [ID_Visit] = @ID_Visit
AND [ID_Station] = @ID_Station;
SET NOCOUNT OFF;
SELECT [hasExited] = @hasExited;
SELECT
@name = ISNULL([name] + ' ' + ISNULL([callingname], [firstname]), '?')
FROM [dbo].[PersonAll]
WHERE [persid] = @PersID;
RETURN CASE WHEN ISNULL(@hasExited, 0) = 1 THEN 1 ELSE 0 END + CASE WHEN ISNULL(@isManualExit, 0) = 1 THEN 2 ELSE 0 END;
END;
GO
GRANT EXECUTE ON [dbo].[VisitInfo] TO [eDosStation];
GO
--2024-09-06
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id=OBJECT_ID('[dbo].[Visit]') AND name='InitError')
ALTER TABLE [dbo].[Visit] ADD InitError INT
go
CREATE OR ALTER PROCEDURE [dbo].[VisitInitConfirm]
@ID_Station INT NULL,
@ID_Visit INT,
@InitError INT
as
UPDATE [dbo].[Visit] SET InitError=@InitError WHERE ID_Station=@ID_Station AND ID_Visit=@ID_Visit;
go
GRANT EXECUTE ON [dbo].[VisitInitConfirm] TO [eDosStation];
GO
ALTER TABLE DBO.PersonInfoSnapshot ADD Info XML;
GO
IF OBJECT_ID('[dbo].[LocalEPD]') IS NULL BEGIN
CREATE TABLE [dbo].[LocalEPD] ( [ID_STATION] INT NOT NULL , [EPD_InternalID] VARCHAR(8) NOT NULL, [ID_EPD] INT NOT NULL, [LastUsed] DATETIME null, PRIMARY KEY([ID_STATION],[EPD_InternalID]) )
end
GO
CREATE OR ALTER PROCEDURE [dbo].[VisitInit] @PersID INT,
@ID_Task INT,
@Inst_CODE INT,
@EPD_InternalID INT,
@isBG BIT,
@EPDVisitID INT = NULL OUTPUT,
@ID_Station INT NULL,
@ID_Visit INT,
@ENTRY_EPD_CLOCK DECIMAL(10, 0) NULL,
@epdType TINYINT = NULL,
@InitError INT = 0
AS
--Local !!
DECLARE @ID_EPD INT ;
DECLARE @now DATETIME = GETDATE() ;
IF @ID_Station IS NULL
SELECT
@ID_Station = [ID_Station]
FROM [dbo].[StationSettings]
WHERE [PCNr] = HOST_NAME() ;
SELECT
@ID_EPD = [ID_EPD]
FROM [dbo].[EPD]
WHERE [EPD_InternalID] = @EPD_InternalID ;
IF @ID_EPD IS NULL BEGIN
INSERT [dbo].[EPD]([EPD_InternalID], [EPD_sn], [EPDType])
VALUES(@EPD_InternalID, CONVERT(VARCHAR(8), @EPD_InternalID), CASE WHEN @epdType IS NOT NULL
THEN @epdType
WHEN @isBG = 0
THEN 2
ELSE 0
END) ;
SET @ID_EPD = SCOPE_IDENTITY() ;
END ;
IF NOT EXISTS
(
SELECT
*
FROM [dbo].[LocalEPD]
WHERE [ID_Station] = @ID_Station
AND [EPD_InternalID] = @EPD_InternalID
)
INSERT [dbo].[LocalEPD]([ID_EPD], [ID_Station], [EPD_InternalID], LastUsed)
VALUES(@ID_EPD, @ID_Station, CONVERT(VARCHAR(8), @EPD_InternalID), @now) ;
ELSE
UPDATE
[dbo].[LocalEPD]
SET
[LastUsed] = @now
WHERE [ID_Station] = @ID_Station
AND [EPD_InternalID] = @EPD_InternalID ;
INSERT [dbo].[Visit]([ID_Station], [PersID], [Inst_CODE], [ID_Visit], [ID_Task], [EntryTime], [ID_EPD], [isBG], [isComplete], [isDeleted], [isAlarmCleared], [isAlarm], [isManualExit], [ENTRY_EPD_CLOCK], [EXIT_EPD_CLOCK], [epdType], [epdID], [InitError] )
VALUES(@ID_Station, @PersID, @Inst_CODE, @ID_Visit, @ID_Task, @now, @ID_EPD, @isBG, 0, 0, 0, 0, 0, @ENTRY_EPD_CLOCK, @ENTRY_EPD_CLOCK, @epdType, @EPD_InternalID, @InitError ) ;
SET @EPDVisitID = @ID_Visit * 100+@ID_Station ;
GO
USE [eDosLocal]
GO
/****** Object: StoredProcedure [dbo].[GetPersonInfo] Script Date: 9/11/2024 10:10:40 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.columns WHERE OBJECT_ID=OBJECT_ID('dbo.[PersonInfoSnapshot]') AND name='eDosAgent')
BEGIN
ALTER TABLE [dbo].[PersonInfoSnapshot] ADD [eDosAgent] BIT NULL;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[GetPersonInfo] @CSN CHAR(14) =NULL, @PersID INT=NULL, @AllowMultipleEPD BIT=0, @CheckUser BIT=1
AS BEGIN
--DECLARE @PersID INT=12103, @CSN CHAR(14) =null, @AllowMultipleEPD BIT=0, @CheckUser bit=1;
SET NOCOUNT ON;
DECLARE @lid_station INT, @lid_visit INT;
IF @PersID IS NULL
SELECT @PersID=[PersID]
FROM [dbo].[PersonInfoSnapshot]
WHERE [CSN]=@CSN COLLATE SQL_Latin1_General_CP850_BIN;
SET NOCOUNT OFF;
SELECT TOP(1)@lid_station=[ID_Station], @lid_visit=[ID_Visit]
FROM [dbo].[Visit]
WHERE [PersID]=@PersID AND [ReturnTime] IS NULL AND [EntryTime]>DATEADD(YEAR, -1, GETDATE())AND([InitError] IS NULL OR [InitError]=0);
SELECT [a].[PersID], [a].[Type], [a].[CSN], [a].[FirstName], [a].[LastName], [a].[NickName], [AccessAllow]=CONVERT(BIT, CASE WHEN @AllowMultipleEPD=1 AND [a].[hasEPD]=1 THEN 0 ELSE [a].[AccessAllow] END), [a].[Language], [a].[MarginHP10_M], [a].[MarginHP10_Y], [a].[Margin], [a].[VisitIDLocked], [a].[ID_CommentToPerson], [a].[Comment], [a].[Deleted], [ReasonNoAccess]=CASE WHEN @AllowMultipleEPD=1 AND [a].[hasEPD]=1 THEN 'EPD not returned'
WHEN ISNULL([VisitIDLocked], 0)>0 THEN 'Locked because of alarm' ELSE [a].[ReasonNoAccess] END, [a].[Dose_52W_microSv], [a].[hasEPD], [activeStation]=@lid_station, [activeVisit]=@lid_visit, [a].[isAgent], [a].[eDosAgent]
FROM(SELECT [p].[PersID], [p].[Type], [p].[CSN], [p].[FirstName], [p].[LastName], [p].[NickName], [AccessAllow]=CASE WHEN @CheckUser=0 THEN 1 ELSE [p].[AccessAllow] END, [p].[Language], [p].[MarginHP10_M], [p].[MarginHP10_Y], [p].[Margin], [p].[VisitIDLocked], [p].[ID_CommentToPerson], [p].[Comment], [p].[Deleted], [p].[ReasonNoAccess], [p].[Dose_52W_microSv], [hasEPD]=CONVERT(BIT, CASE WHEN @lid_visit IS NOT NULL THEN 1 ELSE 0 END), [isAgent]=CONVERT(BIT, CASE WHEN [p].[isAgent] IS NULL THEN 0 ELSE [p].[isAgent] END), [eDosAgent]=CONVERT(BIT, ISNULL(p.edosAgent, 0))
FROM [dbo].[PersonInfoSnapshot] [p]
WHERE [p].[PersID]=@PersID) [a];
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[GetPersonOverview] @PersID INT = NULL
AS
SELECT [p].[PersID],
[p].[Type],
[p].[FirstName],
[p].[LastName],
[p].[NickName],
[AccessAllow] = [p].[AccessAllow],
[p].[Language],
[p].[MarginHP10_M],
[p].[MarginHP10_Y],
[p].[Margin],
[p].[VisitIDLocked],
[p].[ID_CommentToPerson],
[p].[Comment],
[p].[Deleted],
[p].[ReasonNoAccess],
[p].[Dose_52W_microSv],
[isAgent] = CONVERT ( BIT,
CASE
WHEN [p].[isAgent] IS NULL THEN
0
ELSE
[p].[isAgent]
END
),
[info],
[eDosAgent] = CONVERT (BIT, ISNULL ([p].[eDosAgent], 0))
FROM [dbo].[PersonInfoSnapshot] [p]
WHERE [p].[PersID] = @PersID;
GO
GRANT EXECUTE ON [GetPersonOverview] TO [edosstation];
GO

257
scripts/UpdateSql.ps1 Normal file
View file

@ -0,0 +1,257 @@
# Instellingen
$Server = "."
$Database = "eDosLocal"
$ScriptFolder = "C:\software\SqlUpdates" # Map waar update_001.sql, update_002.sql etc. staan
# 1. Haal de huidige databaseversie op via sqlcmd
$CurrentVersionQuery = "SELECT ISNULL(MAX(VersionNumber), 0) FROM DatabaseVersion;"
$CurrentVersionStr = sqlcmd -S $Server -d $Database -Q $CurrentVersionQuery -h -1 -W
$CurrentVersion = [int]$CurrentVersionStr.Trim()
Write-Host "Huidige database versie: $CurrentVersion" -ForegroundColor Cyan
# 2. Scan de map en filter de scripts
$Scripts = Get-ChildItem -Path $ScriptFolder -Filter "update_*.sql" | ForEach-Object {
# Extraheer het nummer uit de bestandsnaam (bijv. "update_004.sql" -> 4)
if ($_.BaseName -match 'update_(\d+)') {
[PSCustomObject]@{
Number = [int]$Matches[1]
Path = $_.FullName
Name = $_.Name
}
}
} | Sort-Object Number # Zorg dat ze ALTIJD op volgorde 1, 2, 3 staan
# 3. Voer de scripts opeenvolgend uit
foreach ($Script in $Scripts) {
# Als het scriptnummer lager of gelijk is aan de huidige versie, overslaan
if ($Script.Number -le $CurrentVersion) {
Write-Host "Skipping $($Script.Name) (Al uitgevoerd of reeds gepasseerd)" -ForegroundColor Gray
continue
}
# Controleer of het script exact de volgende stap is (+1)
if ($Script.Number -ne ($CurrentVersion + 1)) {
Write-Error "Fout: Script $($Script.Name) kan niet worden uitgevoerd. Verwachte versie was $($CurrentVersion + 1)."
exit 1
}
Write-Host "Uitvoeren: $($Script.Name)..." -ForegroundColor Yellow
# Voer het script uit met sqlcmd. -b zorgt dat sqlcmd stopt bij een SQL error (zoals onze severity 20)
sqlcmd -S $Server -d $Database -i $Script.Path -b
# Controleer of sqlcmd een fout heeft gegeven
if ($LASTEXITCODE -ne 0) {
Write-Error "CRITICAL FOUT tijdens het uitvoeren van $($Script.Name). De deployment is gestopt!"
exit 1
}
# Update de lokale variabele voor de volgende loop
$CurrentVersion = $Script.Number
Write-Host "$($Script.Name) succesvol afgerond. Database is nu versie $CurrentVersion." -ForegroundColor Green
}
Write-Host "Database is volledig up-to-date!" -ForegroundColor Green
# SIG # Begin signature block
# MIIlPAYJKoZIhvcNAQcCoIIlLTCCJSkCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUvT1k8kmlnReZL62s9FmNDHJt
# pUCggh9wMIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0B
# AQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk
# IElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQsw
# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw
# ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz
# 7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS
# 5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7
# bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfI
# SKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jH
# trHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14
# Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2
# h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt
# 6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPR
# iQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ER
# ElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4K
# Jpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAd
# BgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SS
# y4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAC
# hjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURS
# b290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRV
# HSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyh
# hyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO
# 0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo
# 8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++h
# UD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5x
# aiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIFvDCCA6Sg
# AwIBAgIBHzANBgkqhkiG9w0BAQsFADBmMQswCQYDVQQGEwJCRTESMBAGA1UECBMJ
# QW50d2VycGVuMQwwCgYDVQQHEwNNb2wxDzANBgNVBAoTBlNDS0NFTjEMMAoGA1UE
# CxMDSUNUMRYwFAYDVQQDEw1TQ0tDRU4gSUNUIENBMB4XDTE4MDUyNDA2MTEwMFoX
# DTMwMDYwMTEyMDAwMFowTzEhMB8GA1UEAxMYVmFuZGVuYnJvdWNrZSBMdWMgQ1My
# MDIxMSowKAYJKoZIhvcNAQkBFhtsdWMudmFuZGVuYnJvdWNrZUBzY2tjZW4uYmUw
# ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD0WzD0gHTLFEbOjPUwobl2
# VntS0kJVV2FRzxkZZ0Hhe9fbYB0tRK5+9GltD7rwhApM1E2xh8N6Pmxfr49VGVsP
# NqDhGRmp5wKE8htQiMXTjHPOTHZsvim/vvSL8WuouGoX6TQxxNBefE6Jmjcg2NHb
# UVAxDGcPwNADJBZnYPQTp6q2HniwdDv/OmZM1JJUYn4v1mt7YtS1eFO30ekuGzJu
# 3WQYeOiFNht/6AXZTWALQtwzaJfm563AbxfnHBsBuZFcRGYPE7aRDI9NIZyPqzT4
# yOAK+phPN1ympNV+f8XXWaacfZXSWolbo8jqstHDjYYjf77Fj3WVN+y0GxtTsnRl
# AgMBAAGjggGKMIIBhjAJBgNVHRMEAjAAMB0GA1UdDgQWBBTftWyIS4unlpS288p5
# Xofe0LiBZTAfBgNVHSMEGDAWgBTwKRT1aiEUklZUE6Q91a3wITrFeDALBgNVHQ8E
# BAMCB4AwHwYDVR0lBBgwFgYIKwYBBQUHAwMGCisGAQQBgjcCARUwOgYDVR0RBDMw
# MYEbbHVjLnZhbmRlbmJyb3Vja2VAc2NrY2VuLmJlgRJsdmFuZGVuYkBzY2tjZW4u
# YmUwNQYDVR0SBC4wLIYqaHR0cDovL2NybC5zY2tjZW4uYmUvU0NLQ0VOJTIwSUNU
# JTIwQ0EuY3J0MDsGA1UdHwQ0MDIwMKAuoCyGKmh0dHA6Ly9jcmwuc2NrY2VuLmJl
# L1NDS0NFTiUyMElDVCUyMENBLmNybDA+BgkrBgEEAYI3FQcEMTAvBicrBgEEAYI3
# FQiEjLwhgsj9d4KhkyKEl5RGhMaSLoEBgtSEIYH6yGkCAWQCAQgwGwYJKwYBBAGC
# NxUKBA4wDDAKBggrBgEFBQcDAzANBgkqhkiG9w0BAQsFAAOCAgEARh/O37vbDW3A
# j1UAnSfYz+I0+fVk2ZurOQarjtdFC/Yu1ABJnXdMnwh1t5sjVIoEejvjnOlmu+B2
# 1IQJPpxIph8cz+SnDZyhOpcKrCDn+PSeRvth0Zk4FvbXsLK9/WYgdzRObNOHxxAN
# COOc7PMLIMqeDJa+b9wH82Ae4MYdB8XZvoqJ+z172yoQMiNxe6UE2GropZiwJB56
# Fw+k/jrKdOMEfZtfhzRqizCmMlTknbtFJ5hrqhwcaTA+4QCfCwouckererOATQnM
# 8Ic1KaOmYK7S5igmnA5mekiTKrBhcGp/xsZy0r8OUKVV1FSYnQ3035THia31oQzh
# Le48faEFkNuPbs8ZaiTFXwbdWGQ6uIK++soyulWOxeueNBAqIOGrj7XuDaIk+VD3
# RN0B0g//Nv3HS6FboRC0eKeG3yezzjU+8fImcyPAaAEofUiiQYdOpnJsiaLDpHO+
# 1r98pKmpe0fvy0IvYHicJLuk4tFyMvVBRgW1A+JtfHuXCnag88iB8AJ3tCUdGRCC
# z8yE1r4hbklyqhj9G5EmxoKZfi7mgh3CgL/tRUAXNqFltMj3cQlGKcKPUH004dKm
# FwAUAG4mzsO1Sk50S7EvdpvaW+sJ/bWMjXzLuq+xFwrsSTQ22KSm8XmnX2NGqws5
# Tk+pqQupcwan4CsjflVqMva5nc4YxI4wggZyMIIEWqADAgECAhM4AAAAAm7pDq12
# AeXXAAAAAAACMA0GCSqGSIb3DQEBCwUAMGcxCzAJBgNVBAYTAkJFMRIwEAYDVQQI
# EwlBbnR3ZXJwZW4xDDAKBgNVBAcTA01vbDEPMA0GA1UEChMGU0NLQ0VOMQwwCgYD
# VQQLEwNJQ1QxFzAVBgNVBAMTDlNDS0NFTiBSb290IENBMB4XDTE3MDYyMzExMzkz
# NFoXDTMyMDYyMzExNDkzNFowZjELMAkGA1UEBhMCQkUxEjAQBgNVBAgTCUFudHdl
# cnBlbjEMMAoGA1UEBxMDTW9sMQ8wDQYDVQQKEwZTQ0tDRU4xDDAKBgNVBAsTA0lD
# VDEWMBQGA1UEAxMNU0NLQ0VOIElDVCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
# ADCCAgoCggIBALFtbifIAikMI3YQIa+niSTV8PsH34uadkQePLs02kIdmPPT/u+T
# RYZO6njltLVcGnMWJLmzL4DamrAPUbJcpkRLMS35aDAonUT0kI/KNChNnHy2KI2K
# 3tUwoRcXND2aG4m2ewU7FNr++RkI57BBDJsc8CSwI0lNphVSiSo6yrOF7f6uo98N
# H3a0c9G2vM0jG0xztivAndUatxkAyz8rYScg8c6OmERO0xThXFxqyKRV75stVz3P
# yLYh8E6HDpkNZrBfuOltIH1rWxS7fGwvwp7hNmUD5wJqat5TlLvHDqv9nqoYoQHg
# JYuTHGHqWivqq9SbSzX4E0pJBRcNu3OXD18BQghNK8iXTfqjeF3ZNydos9IWshCe
# LBmopnSU17/zk5kscShjJz2FfgU75PzwyZxo1kKjq8n9D1oJsFUNSgKMGj4wQFyT
# hKLczZ81tPxSrb4CWC5N8RbN7CSehBug9NsAdkTbMzRjOurcqqsf2d+udccM4JGG
# EdRE3ZnXXKi+v92vh4n0uSvfTfqu61/0ad9QFJTbG+d8YYeNzVlAIOU862/SeeJg
# UemfzGn5k1R3CtpyukUWGlH8bP1rhNvjs1+zHRv1EYtZVbjru4aewCp0o3C5znAR
# u5ZEitUNaQrgAmDJLwpfu5HoqN++mpFH7pl9x6hFYCvLbWYkYIlR0e0NAgMBAAGj
# ggEWMIIBEjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU8CkU9WohFJJWVBOk
# PdWt8CE6xXgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGG
# MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUr8bKrgoIFExryOnviOUxtH5
# FDAwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5zY2tjZW4uYmUvU0NLQ0VO
# JTIwUm9vdCUyMENBLmNybDBHBggrBgEFBQcBAQQ7MDkwNwYIKwYBBQUHMAKGK2h0
# dHA6Ly9jcmwuc2NrY2VuLmJlL1NDS0NFTiUyMFJvb3QlMjBDQS5jcnQwDQYJKoZI
# hvcNAQELBQADggIBAIbENXjQHhcyihmPSltFTBqy1G7XHIx6HipRnVZ/soUvcYUm
# iBYJtNCD1Tuc4fYyrYAgN6PNU6mNMNVqEStVPLfPTp+UWWFct/aQ8rvqAZR4LpfS
# jriWyCi4IdFYBD72N7zNIdGy3cSK55SMXIVcYLOcv4f8Cyply47IPgLmM7CePvRg
# A+UrHRRqdo4ij3/WsOsxuu2p9sk6rbz33qEaZDFjvjMd/QllsH1NzGkMkpQMdPyc
# 2XKls5OkBYDdYfPcEgRw9JjBXZ2oRLYecvUIT5C8nT54omxeVWefYG1FZaRRc/FX
# XZgbcfcX3uWiGBI5I9+R5hFvxTe6sJyT93QpY8xYqkrniqohSDd6bp4x2zFKAMSZ
# 4m8ddV8+KRZuZnZPL/ea/rJ3B/EhSvz+Z1I4xGCAUSJ2YqL5ewvCnyNUQ/ZVyQz3
# cOclX5AqZAq/62DTTAR3w2GfhtTRLvVsxNja5JwuB+KqDSS5jI1T07MHCE+/NIjr
# xWUX9apftHtkylBwjpGfqZV7Zdx+jIpqzZOgf2UAMuJhEzR+nHmqLnVe1+WOx820
# 8ElwksOhgokDHWF4LBafpYqKKxJhWYVXNj07PqFF2zIvCFGgsihJurTGRyfjxlNW
# ARPEs8o+ZyNUlIW/mh7p0RpYYFz2+G5xHWVWjK7sRTNFG64hsJpDhL/XD1aQMIIG
# tDCCBJygAwIBAgIQDcesVwX/IZkuQEMiDDpJhjANBgkqhkiG9w0BAQsFADBiMQsw
# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw
# HhcNMjUwNTA3MDAwMDAwWhcNMzgwMTE0MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEX
# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0
# ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExMIICIjAN
# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtHgx0wqYQXK+PEbAHKx126NGaHS0
# URedTa2NDZS1mZaDLFTtQ2oRjzUXMmxCqvkbsDpz4aH+qbxeLho8I6jY3xL1IusL
# opuW2qftJYJaDNs1+JH7Z+QdSKWM06qchUP+AbdJgMQB3h2DZ0Mal5kYp77jYMVQ
# XSZH++0trj6Ao+xh/AS7sQRuQL37QXbDhAktVJMQbzIBHYJBYgzWIjk8eDrYhXDE
# pKk7RdoX0M980EpLtlrNyHw0Xm+nt5pnYJU3Gmq6bNMI1I7Gb5IBZK4ivbVCiZv7
# PNBYqHEpNVWC2ZQ8BbfnFRQVESYOszFI2Wv82wnJRfN20VRS3hpLgIR4hjzL0hpo
# YGk81coWJ+KdPvMvaB0WkE/2qHxJ0ucS638ZxqU14lDnki7CcoKCz6eum5A19WZQ
# HkqUJfdkDjHkccpL6uoG8pbF0LJAQQZxst7VvwDDjAmSFTUms+wV/FbWBqi7fTJn
# jq3hj0XbQcd8hjj/q8d6ylgxCZSKi17yVp2NL+cnT6Toy+rN+nM8M7LnLqCrO2JP
# 3oW//1sfuZDKiDEb1AQ8es9Xr/u6bDTnYCTKIsDq1BtmXUqEG1NqzJKS4kOmxkYp
# 2WyODi7vQTCBZtVFJfVZ3j7OgWmnhFr4yUozZtqgPrHRVHhGNKlYzyjlroPxul+b
# gIspzOwbtmsgY1MCAwEAAaOCAV0wggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD
# VR0OBBYEFO9vU0rp5AZ8esrikFb2L9RJ7MtOMB8GA1UdIwQYMBaAFOzX44LScV1k
# TN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcD
# CDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj
# ZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t
# L0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0
# cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmww
# IAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUA
# A4ICAQAXzvsWgBz+Bz0RdnEwvb4LyLU0pn/N0IfFiBowf0/Dm1wGc/Do7oVMY2mh
# XZXjDNJQa8j00DNqhCT3t+s8G0iP5kvN2n7Jd2E4/iEIUBO41P5F448rSYJ59Ib6
# 1eoalhnd6ywFLerycvZTAz40y8S4F3/a+Z1jEMK/DMm/axFSgoR8n6c3nuZB9BfB
# wAQYK9FHaoq2e26MHvVY9gCDA/JYsq7pGdogP8HRtrYfctSLANEBfHU16r3J05qX
# 3kId+ZOczgj5kjatVB+NdADVZKON/gnZruMvNYY2o1f4MXRJDMdTSlOLh0HCn2cQ
# LwQCqjFbqrXuvTPSegOOzr4EWj7PtspIHBldNE2K9i697cvaiIo2p61Ed2p8xMJb
# 82Yosn0z4y25xUbI7GIN/TpVfHIqQ6Ku/qjTY6hc3hsXMrS+U0yy+GWqAXam4ToW
# d2UQ1KYT70kZjE4YtL8Pbzg0c1ugMZyZZd/BdHLiRu7hAWE6bTEm4XYRkA6Tl4KS
# FLFk43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAvjSabnf7+Pu0VrFgoiovRDiyx
# 3zEdmcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3JE3rYkrhLULy7Dc90G6e8Blqm
# yIjlgp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM1pD2T7m3XDCCBu0wggTVoAMC
# AQICEAhP3DNPfkVO28MPj/mSGDUwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMC
# VVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBU
# cnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMTAe
# Fw0yNjA4MDUwMDAwMDBaFw0zNzExMDQyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgU0hBMjU2
# IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI2IDEwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQC2e6byyf7NSvjUm0xls/04xjD4fAkOkbnGQi7+
# Wpx81iYxfzViaxSIctuH3KSl5YEYpMuFgGsA31N2D9ATMbfZdw5uaAhuWevQKhDd
# ZIB4NnqcfpfpWQXJiQnDdAElETC+bhSEvNLGbA8DtwUpFMQ4yyYQSPqomT92osQA
# v6hBi47ATZS6JfVWe6XxhF4jJZ3iSAuf2Cros1czRSmWRHqMv9AfGZvp8ygYElhu
# dpQjtcPpwoOl6QrZJUyV3iINvN4cO05prGV0fkjG426xDr2d3z9lcSIHkdvGPdGU
# rXdxfVbgOUVcp2/8ISEzwKPW++Wa+E2ujI91EZtukGWDJ/xZ27k3oHKEXBRGfRTq
# jOU+jE3ba/5++JSE/7oNHnjs5mekExYN96LV/mxUbCKJb8pBNY4r3uD7hEmk/M81
# XhVgwDA7aMzYC3LZBg9WY5BMmbSay5ecmtJuXaB/0nKWmQmVZeqTVDgsmzHP5MQu
# hAJkiWNuC9MmCg9TZHXbJ2/yLVSov9p16UDTLtT0+aa1vN71fHeu1qMLlLNB3WOB
# /ADCxr3S/1hxI92Z6jKgEED/btwIvbfuXkNNhg8MtDg43c4tMZae9FvqMOt/9Pvm
# AxF9TNIsIFB8G6yb36ZJZGUL8N/pL971DyLXcK6HM5PYnH5X+eVtczhCgHCVQCF6
# XDAlPQIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUFMljijAu
# 1Er7bpTz5uNAfvXszeIwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04w
# DgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMIGVBggrBgEF
# BQcBAQSBiDCBhTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t
# MF0GCCsGAQUFBzAChlFodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl
# cnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2U0hBMjU2MjAyNUNBMS5jcnQw
# XwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lD
# ZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEuY3Js
# MCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsF
# AAOCAgEAjcU6YR6dUgrfmawJgH59KECxa9Ji8sEi2g10CBDaMiqsaxWyW5cwlT/6
# ZF5sFznazqVsoC85U9dqLOYqQwst+UQQoNlDHgKRLa3xoc+OReFreFhnTXSG0Vrd
# 2E2CZqUfm+5a+He1MJ/h+tNLuA+0Zzhn/Fo+FDYAHWZHx4R79ZsfRFYe9UiXpXBD
# f6DkUo183Y38NYmR/XfDYf7YZ+oR9t3flbDwK+hgGMs0gNNp1w9Z2CyOyI5or/sS
# womAuNQ0hWC9xoU4stD8aWsD7RkcmgVRs6vlIk3zPKQ+ylcheWkMlj+CoVRlFE55
# pv0ZWCaFt04lwP/rdGHE9qEVQZtyRE42ox7oNgC/r+Y4bSlZ3dw9K2x1xLtu6PkP
# KeLBFjzKigwfqm3Hm+k/+lnME8F5kPZTgiy2HLEHklpryqs6QHnPXrRNeIzkAMyy
# lnRN8P0wmirS0WkU+ywpEWFZ4QNg+9xS43tTuW9x0eXh7NDc1P/sV+zWxHXKH8tF
# t1ncHdVzqrZaYPyYMLSn2TOXajveJW1L3joiQSPsWRGxkbDDW15jERFE4LvjnGu2
# O9zD1nLJSMdlYZEikl4w2w+q4IN/R+TIe0H4ngCI1moJCTbevGH4punIxM1Uoi0n
# mX3ZK+XbRT01uowE5ViXWHng0RgsmrX/EdYUo80r3TfMlkD0/YMxggU2MIIFMgIB
# ATBrMGYxCzAJBgNVBAYTAkJFMRIwEAYDVQQIEwlBbnR3ZXJwZW4xDDAKBgNVBAcT
# A01vbDEPMA0GA1UEChMGU0NLQ0VOMQwwCgYDVQQLEwNJQ1QxFjAUBgNVBAMTDVND
# S0NFTiBJQ1QgQ0ECAR8wCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKA
# AKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFCjLrQHyizo8/xWGuudC9eFZ
# YDd0MA0GCSqGSIb3DQEBAQUABIIBAHPBqLCnnWtH7A5HTQuuiH+2knTQ9zZfs7nN
# SBz8kixoRGmYIVyp2NvOHdHLsumyjHSohFpezRETXP7v0Ld8A9KzwdDremTUaCSP
# wq2NFGHvJ8sUDCn+92qIYM3EHuUVWnL4+X4nQiU/xKaaP+95tvdOD+zldAtDrOMN
# fCOQn4wLrTGIUn404K9cemuiSUXhqQZGfh9klgUR89Nlhn6l6H/Y+s6147fVFq1d
# c4riAMgqRLETC0l033BjlqsTb9KxrpZq2A/P9HBJ+aauNic4GDt0o0O8cbWNIAsu
# ftyI9iZUPn+KFdC/Q9rTkITz3Uj08qq05HtO4TJdXvTG+fzJ2tChggMmMIIDIgYJ
# KoZIhvcNAQkGMYIDEzCCAw8CAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAIT9wzT35FTtvDD4/5
# khg1MA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTA0MTY1MDU2WjAvBgkqhkiG9w0BCQQxIgQgsFNC
# rfQYEMX1jMMKWMIAthxhxU9e32M5DpTch3wWr/EwDQYJKoZIhvcNAQEBBQAEggIA
# pVQcMkNJ8+X0k3hnqSMCevLP3ZIx01oTY5AqrBEF5Ut9ysfvzLR1K48V0Xq/4pFU
# S1SWp8M4HmoevWqTypUAHD9zsAbKgrrCm5NdYfGqpPIwmdLXDLS9DqiENrfakZAF
# ajHjaOwtWMPdgJyUpFQKLy6JYoUTBQuuBKewTYfr++g28aHechk3+KAtRIOKZSbp
# Gpfg4kJzRmXL0ycH+ZEexLgwYOMQdzfARqUDT8sOgb3OR1vD+IAz6cwdGNHzgvB1
# aldR6l8C0orvtGdd2b25jaGOMfZEwf1Mr8nh8zgLNnYtXD5drI7OM7qG8S2+MlzA
# W2BpCrsKs8jHlykFTHQLVw3fDfL+pUeCIumtwkh+x0NIzwn1peobop/HVwdlbyzT
# E14IVnlkEWx/yvgVctmAAYQPL0z0JzLRA86BnzC4R618zIaXC1UIPVhKMOaXasyj
# y9vK1ZLfNjEmDblfDB/TnQzfWcX1nyBtwx02V1HNaM4TM02O45jwC29FFnMUcsqM
# 7JlIoSB+Ap+tAqO/UHMPqr1wfb4hNhiAfTar/ltjdtFdgHTIWtMkweYZNDZLZ4V8
# Ma3aXkr/XM4RlamsUcleoDCxljBcPGAmmsRvffdN+RsbZjP9jmTdnzd2RH6CShiJ
# ZQT3tqiDkOG6OKjruqMtrmLmYuoKuCsGORjNsEaT3Gk=
# SIG # End signature block

View file

@ -1,404 +0,0 @@
USE [eDosLocal];
GO
/****** Object: StoredProcedure [dbo].[GetPersonInfo] Script Date: 8/03/2022 15:53:18 ******/
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
USE [eDosLocal];
GO
/****** Object: StoredProcedure [dbo].[GetPersonInfo] Script Date: 19/04/2022 13:08:50 ******/
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id=OBJECT_ID('[dbo].[PersonInfoSnapshot]') AND name='isAgent')
ALTER TABLE [dbo].[PersonInfoSnapshot] ADD isAgent BIT NULL;
GO
--2022-08-24 ChirpRate
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id=OBJECT_ID('[dbo].[TaskInfoSnapshot]') AND name='ChirpRate')
ALTER TABLE [dbo].[TaskInfoSnapshot] ADD ChirpRate REAL NULL;
GO
ALTER PROCEDURE [dbo].[GetPersonInfo] @CSN CHAR(14) = NULL,
@PersID INT = NULL,
@AllowMultipleEPD BIT = 0
AS BEGIN
--DECLARE @PersID INT = 12103, @CSN CHAR(14) = null,@AllowMultipleEPD BIT = 0;
SET NOCOUNT ON;
DECLARE
@lid_station INT,
@lid_visit INT;
IF @PersID IS NULL
SELECT
@PersID = [PersID]
FROM [dbo].[PersonInfoSnapshot]
WHERE [CSN] = @CSN COLLATE SQL_Latin1_General_CP850_BIN;
SET NOCOUNT OFF;
SELECT TOP(1)
@lid_station = [ID_Station],
@lid_visit = [ID_Visit]
FROM [dbo].[Visit]
WHERE [PersID] = @PersID
AND [ReturnTime] IS NULL
AND [EntryTime] > DATEADD(YEAR, -1, GETDATE());
SELECT
[a].[PersID],
[a].[Type],
[a].[CSN],
[a].[FirstName],
[a].[LastName],
[a].[NickName],
[AccessAllow] = CONVERT(BIT, CASE WHEN @AllowMultipleEPD = 1
AND [a].[hasEPD] = 1 THEN 0 ELSE [a].[AccessAllow] END),
[a].[Language],
[a].[MarginHP10_M],
[a].[MarginHP10_Y],
[a].[Margin],
[a].[VisitIDLocked],
[a].[ID_CommentToPerson],
[a].[Comment],
[a].[Deleted],
[ReasonNoAccess] = CASE WHEN @AllowMultipleEPD = 1
AND [a].[hasEPD] = 1 THEN 'EPD not returned'
WHEN ISNULL([VisitIDLocked], 0) > 0 THEN 'Locked because of alarm' ELSE [a].[ReasonNoAccess] END,
[a].[Dose_52W_microSv],
[a].[hasEPD],
[activeStation] = @lid_station,
[activeVisit] = @lid_visit,
[a].[isAgent]
FROM(SELECT
[p].[PersID],
[p].[Type],
[p].[CSN],
[p].[FirstName],
[p].[LastName],
[p].[NickName],
[p].[AccessAllow],
[p].[Language],
[p].[MarginHP10_M],
[p].[MarginHP10_Y],
[p].[Margin],
[p].[VisitIDLocked],
[p].[ID_CommentToPerson],
[p].[Comment],
[p].[Deleted],
[p].[ReasonNoAccess],
[p].[Dose_52W_microSv],
[hasEPD] = CONVERT(BIT, CASE WHEN @lid_visit IS NOT NULL THEN 1 ELSE 0 END),
[isAgent] = CONVERT(BIT, CASE WHEN [p].[isAgent] IS NULL THEN 0 ELSE [p].[isAgent] END)
FROM [dbo].[PersonInfoSnapshot] [p]
WHERE [p].[PersID] = @PersID) [a];
END;
go
---- Luc 2022-03-25
USE [eDosLocal]
go
IF SCHEMA_ID('syncloc') IS NULL
BEGIN
exec('CREATE SCHEMA [syncLoc]')
END
GO
IF OBJECT_ID ('[syncLoc].[compareVisit]') IS NULL
BEGIN
CREATE TABLE [syncLoc].[compareVisit](
[ID_Station] [INT] NOT NULL,
[ID_Visit] [INT] NOT NULL,
[Inst_CODE] [INT] NOT NULL,
[PersID] [INT] NULL,
[ID_Task] [INT] NULL,
[EntryTime] [DATETIME] NULL,
[ReturnTime] [DATETIME] NULL,
[Hp10Dose] [FLOAT] NULL,
[Hp07Dose] [FLOAT] NULL,
[Hp10Total] [FLOAT] NULL,
[Hp07Total] [FLOAT] NULL,
[Hp10Peak] [FLOAT] NULL,
[Hp07Peak] [FLOAT] NULL,
[Hp10Time] [DATETIME] NULL,
[Hp07Time] [DATETIME] NULL,
[ID_EPD] [INT] NULL,
[QualityData] [INT] NULL,
[K1] [INT] NULL,
[K2] [INT] NULL,
[K3] [INT] NULL,
[K4] [INT] NULL,
[K5] [INT] NULL,
[K6] [INT] NULL,
[SG] [INT] NULL,
[BC] [INT] NULL,
[FB] [INT] NULL,
[HG] [INT] NULL,
[alarmStatus] [INT] NULL,
[otherAlarms] [INT] NULL,
[errorStatus] [INT] NULL,
[operatingStatus] [INT] NULL,
[isBG] [BIT] NULL,
[isComplete] [BIT] NOT NULL,
[isDeleted] [BIT] NOT NULL,
[isAlarm] [BIT] NOT NULL,
[isAlarmCleared] [BIT] NOT NULL,
[isManualExit] [BIT] NOT NULL,
[ID_Station_Return] [INT] NULL,
[ENTRY_EPD_CLOCK] [NUMERIC](10, 0) NULL,
[EXIT_EPD_CLOCK] [NUMERIC](10, 0) NULL,
[TIME_LOST] [INT] NULL,
[epdID] [INT] NULL,
[eDosBatteryWarning] [BIT] NULL,
[eDosDose07Warning] [BIT] NULL,
[eDosDose07Alarm] [BIT] NULL,
[eDosRate07Warning] [BIT] NULL,
[eDosRate07Alarm] [BIT] NULL,
[eDosDose10Warning] [BIT] NULL,
[eDosDose10Alarm] [BIT] NULL,
[eDosRate10Warning] [BIT] NULL,
[eDosRate10Alarm] [BIT] NULL,
CONSTRAINT [PK_compareVisit] PRIMARY KEY CLUSTERED
(
[ID_Station] ASC,
[ID_Visit] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];
GRANT ALTER,
INSERT,
UPDATE,
DELETE,
SELECT
ON [syncLoc].[compareVisit]
TO [edosStation];
END;
GO
IF NOT EXISTS (SELECT
*
FROM [sys].[columns]
WHERE [object_id] = OBJECT_ID('[syncLoc].[compareVisit]')
AND [name] = 'eDosBatteryWarning')BEGIN
ALTER TABLE [syncLoc].[compareVisit] ADD [eDosBatteryWarning] BIT NULL;
ALTER TABLE [syncLoc].[compareVisit] ADD [eDosDose07Warning] BIT NULL;
ALTER TABLE [syncLoc].[compareVisit] ADD [eDosDose07Alarm] BIT NULL;
ALTER TABLE [syncLoc].[compareVisit] ADD [eDosRate07Warning] BIT NULL;
ALTER TABLE [syncLoc].[compareVisit] ADD [eDosRate07Alarm] BIT NULL;
ALTER TABLE [syncLoc].[compareVisit] ADD [eDosDose10Warning] BIT NULL;
ALTER TABLE [syncLoc].[compareVisit] ADD [eDosDose10Alarm] BIT NULL;
ALTER TABLE [syncLoc].[compareVisit] ADD [eDosRate10Warning] BIT NULL;
ALTER TABLE [syncLoc].[compareVisit] ADD [eDosRate10Alarm] BIT NULL;
END;
GO
ALTER PROCEDURE [syncLoc].[UpdateRemoteReturns] @ID_LocalStation INT = NULL,
@pcnr VARCHAR(20) = NULL
AS BEGIN
-- Luc 2022-03-25
--DECLARE @ID_LocalStation INT = 9;
--DECLARE @pcnr VARCHAR(20);
IF @pcnr = 'EDOS-SCH' SET @pcnr = 'EDOS-WSCH';
ELSE IF @pcnr = 'DESKTOP-CCDL4A3' SET @pcnr = 'EDOS-LNK';
ELSE IF @pcnr = 'EDOS-ZZZ' SET @pcnr = 'EDOS-LSCH';
IF @ID_LocalStation IS NULL BEGIN
IF @pcnr IS NULL SET @pcnr = @@serverName;
IF @pcnr = 'EDOS-SCH' SET @pcnr = 'EDOS-WSCH';
ELSE IF @pcnr = 'DESKTOP-CCDL4A3' SET @pcnr = 'EDOS-LNK';
ELSE IF @pcnr = 'EDOS-ZZZ' SET @pcnr = 'EDOS-LSCH';
SELECT
@ID_LocalStation = [ID_Station]
FROM [dbo].[StationSettings]
WHERE [PCNr] = @pcnr;
END;
SELECT
@ID_LocalStation,
[PCNr]
FROM [dbo].[StationSettings]
WHERE [ID_Station] = @ID_LocalStation;
TRUNCATE TABLE [syncLoc].[compareVisit];
INSERT [syncLoc].[compareVisit]([ID_Station], [ID_Visit], [Inst_CODE], [PersID], [ID_Task], [EntryTime], [ReturnTime], [Hp10Dose], [Hp07Dose], [Hp10Total], [Hp07Total], [Hp10Peak], [Hp07Peak], [Hp10Time], [Hp07Time], [ID_EPD], [QualityData], [K1], [K2], [K3], [K4], [K5], [K6], [SG], [BC], [FB], [HG], [alarmStatus], [otherAlarms], [errorStatus], [operatingStatus], [isBG], [isComplete], [isDeleted], [isAlarm], [isAlarmCleared], [isManualExit], [ID_Station_Return], [ENTRY_EPD_CLOCK], [EXIT_EPD_CLOCK], [TIME_LOST], [epdID], [eDosBatteryWarning], [eDosDose07Warning], [eDosDose07Alarm], [eDosRate07Warning], [eDosRate07Alarm], [eDosDose10Warning], [eDosDose10Alarm], [eDosRate10Warning], [eDosRate10Alarm])
SELECT
[v].[ID_Station],
[v].[ID_Visit],
[v].[Inst_CODE],
[v].[PersID],
[v].[ID_Task],
[v].[EntryTime],
[v].[ReturnTime],
[v].[Hp10Dose],
[v].[Hp07Dose],
[v].[Hp10Total],
[v].[Hp07Total],
[v].[Hp10Peak],
[v].[Hp07Peak],
[v].[Hp10Time],
[v].[Hp07Time],
[v].[ID_EPD],
[v].[QualityData],
[v].[K1],
[v].[K2],
[v].[K3],
[v].[K4],
[v].[K5],
[v].[K6],
[v].[SG],
[v].[BC],
[v].[FB],
[v].[HG],
[v].[alarmStatus],
[v].[otherAlarms],
[v].[errorStatus],
[v].[operatingStatus],
[v].[isBG],
[v].[isComplete],
[v].[isDeleted],
[v].[isAlarm],
[v].[isAlarmCleared],
[v].[isManualExit],
[v].[ID_Station_Return],
[v].[ENTRY_EPD_CLOCK],
[v].[EXIT_EPD_CLOCK],
[v].[TIME_LOST],
[v].[epdID],
[v].[eDosBatteryWarning],
[v].[eDosDose07Warning],
[v].[eDosDose07Alarm],
[v].[eDosRate07Warning],
[v].[eDosRate07Alarm],
[v].[eDosDose10Warning],
[v].[eDosDose10Alarm],
[v].[eDosRate10Warning],
[v].[eDosRate10Alarm]
FROM [EDOS].[edos].[dbo].[Visit] [v]
INNER JOIN(SELECT
[ID_Visit]
FROM [dbo].[Visit]
WHERE [ID_Station] = @ID_LocalStation
AND [ReturnTime] IS NULL) [i] ON [i].[ID_Visit] = [v].[ID_Visit]
WHERE [v].[ID_Station] = @ID_LocalStation
AND [v].[ReturnTime] IS NOT NULL;
UPDATE
[dbo].[Visit]
SET
[ReturnTime] = [c].[ReturnTime],
[Hp10Dose] = [c].[Hp10Dose],
[Hp07Dose] = [c].[Hp07Dose],
[Hp10Total] = [c].[Hp10Total],
[Hp07Total] = [c].[Hp07Total],
[Hp10Peak] = [c].[Hp10Peak],
[Hp07Peak] = [c].[Hp07Peak],
[Hp10Time] = [c].[Hp10Time],
[Hp07Time] = [c].[Hp07Time],
[QualityData] = [c].[QualityData],
[K1] = [c].[K1],
[K2] = [c].[K2],
[K3] = [c].[K3],
[K4] = [c].[K4],
[K5] = [c].[K5],
[K6] = [c].[K6],
[SG] = [c].[SG],
[BC] = [c].[BC],
[FB] = [c].[FB],
[HG] = [c].[HG],
[alarmStatus] = [c].[alarmStatus],
[otherAlarms] = [c].[otherAlarms],
[errorStatus] = [c].[errorStatus],
[operatingStatus] = [c].[operatingStatus],
[isComplete] = [c].[isComplete],
[isDeleted] = [c].[isDeleted],
[isAlarm] = [c].[isAlarm],
[isAlarmCleared] = [c].[isAlarmCleared],
[isManualExit] = CASE WHEN [v].[isManualExit] IS NULL
OR [c].[isManualExit] = 1 THEN [c].[isManualExit] ELSE [v].[isManualExit] END,
[ID_Station_Return] = ISNULL([c].[ID_Station_Return], [v].[ID_Station_Return]),
[EXIT_EPD_CLOCK] = [c].[EXIT_EPD_CLOCK],
[eDosBatteryWarning] = CASE WHEN [v].[eDosBatteryWarning] IS NULL
OR [c].[eDosBatteryWarning] = 1 THEN [c].[eDosBatteryWarning] ELSE [v].[eDosBatteryWarning] END,
[eDosDose07Warning] = CASE WHEN [v].[eDosDose07Warning] IS NULL
OR [c].[eDosDose07Warning] = 1 THEN [c].[eDosDose07Warning] ELSE [v].[eDosDose07Warning] END,
[eDosDose07Alarm] = CASE WHEN [v].[eDosDose07Alarm] IS NULL
OR [c].[eDosDose07Alarm] = 1 THEN [c].[eDosDose07Alarm] ELSE [v].[eDosDose07Alarm] END,
[eDosRate07Warning] = CASE WHEN [v].[eDosRate07Warning] IS NULL
OR [c].[eDosRate07Warning] = 1 THEN [c].[eDosRate07Warning] ELSE [v].[eDosRate07Warning] END,
[eDosRate07Alarm] = CASE WHEN [v].[eDosRate07Alarm] IS NULL
OR [c].[eDosRate07Alarm] = 1 THEN [c].[eDosRate07Alarm] ELSE [v].[eDosRate07Alarm] END,
[eDosDose10Warning] = CASE WHEN [v].[eDosDose10Warning] IS NULL
OR [c].[eDosDose10Warning] = 1 THEN [c].[eDosDose10Warning] ELSE [v].[eDosDose10Warning] END,
[eDosDose10Alarm] = CASE WHEN [v].[eDosDose10Alarm] IS NULL
OR [c].[eDosDose10Alarm] = 1 THEN [c].[eDosDose10Alarm] ELSE [v].[eDosDose10Alarm] END,
[eDosRate10Warning] = CASE WHEN [v].[eDosRate10Warning] IS NULL
OR [c].[eDosRate10Warning] = 1 THEN [c].[eDosRate10Warning] ELSE [v].[eDosRate10Warning] END,
[eDosRate10Alarm] = CASE WHEN [v].[eDosRate10Alarm] IS NULL
OR [c].[eDosRate10Alarm] = 1 THEN [c].[eDosRate10Alarm] ELSE [v].[eDosRate10Alarm] END
FROM [dbo].[Visit] [v]
INNER JOIN [syncLoc].[compareVisit] [c] ON [c].[ID_Station] = [v].[ID_Station]
AND [c].[ID_Visit] = [v].[ID_Visit]
WHERE [v].[ReturnTime] IS NULL
AND [v].[isComplete] = 0;
END;
GO
GRANT EXECUTE ON [syncLoc].[UpdateRemoteReturns] TO [eDosStation];
GO
--2022-08-24 ChirpRate
ALTER PROCEDURE [dbo].[GetTaskInfo] @ID_Task INT = NULL, @WorkerDosisMargin FLOAT = NULL AS
--DECLARE @ID_Task INT =5,@WorkerDosisMargin FLOAT=10
SELECT
[t].[ID_Task],
[t].[Inst_CODE],
[t].[TaskType_CODE],
[t].[Task_Name],
[t].[TaskDescription],
[t].[EPDRad],
[t].[ID_AlarmEPD],
[t].[TaskDateStart],
[t].[TaskDateEnd],
[t].[TaskEnable],
[t].[ID_FNGainANGain],
[t].[Hp10Dose1],
[t].[Hp10Dose2],
[t].[Hp07Dose],
[t].[HP10Rate1ON],
[t].[HP10Rate1OFF],
[t].[HP10Rate2ON],
[t].[HP10Rate2OFF],
[t].[HP07RateON],
[t].[HP07RateOFF],
[t].[FNGain_ANGainValue],
[t].[InstallationActivity],
[t].[Description],
[t].[Inst_CODE],
[t].[MinWorkerDosisMargin],
[MarginExceeded] = CONVERT(BIT, CASE WHEN @WorkerDosisMargin IS NULL
OR [t].[MinWorkerDosisMargin] > @WorkerDosisMargin THEN 1 ELSE 0 END),
[ChirpRate] = CONVERT(REAL,ISNULL([t].[ChirpRate],0.0))
FROM [dbo].[TaskInfoSnapshot] [t]
WHERE @ID_Task IS NULL
OR [t].[ID_Task] = @ID_Task;
go

View file

@ -274,25 +274,25 @@ exit
# FLFk43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAvjSabnf7+Pu0VrFgoiovRDiyx
# 3zEdmcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3JE3rYkrhLULy7Dc90G6e8Blqm
# yIjlgp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM1pD2T7m3XDCCBu0wggTVoAMC
# AQICEAqA7xhLjfEFgtHEdqeVdGgwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMC
# AQICEAhP3DNPfkVO28MPj/mSGDUwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMC
# VVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBU
# cnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMTAe
# Fw0yNTA2MDQwMDAwMDBaFw0zNjA5MDMyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# Fw0yNjA4MDUwMDAwMDBaFw0zNzExMDQyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgU0hBMjU2
# IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI1IDEwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQDQRqwtEsae0OquYFazK1e6b1H/hnAKAd/KN8wZ
# QjBjMqiZ3xTWcfsLwOvRxUwXcGx8AUjni6bz52fGTfr6PHRNv6T7zsf1Y/E3IU8k
# gNkeECqVQ+3bzWYesFtkepErvUSbf+EIYLkrLKd6qJnuzK8Vcn0DvbDMemQFoxQ2
# Dsw4vEjoT1FpS54dNApZfKY61HAldytxNM89PZXUP/5wWWURK+IfxiOg8W9lKMqz
# dIo7VA1R0V3Zp3DjjANwqAf4lEkTlCDQ0/fKJLKLkzGBTpx6EYevvOi7XOc4zyh1
# uSqgr6UnbksIcFJqLbkIXIPbcNmA98Oskkkrvt6lPAw/p4oDSRZreiwB7x9ykrjS
# 6GS3NR39iTTFS+ENTqW8m6THuOmHHjQNC3zbJ6nJ6SXiLSvw4Smz8U07hqF+8CTX
# aETkVWz0dVVZw7knh1WZXOLHgDvundrAtuvz0D3T+dYaNcwafsVCGZKUhQPL1naF
# KBy1p6llN3QgshRta6Eq4B40h5avMcpi54wm0i2ePZD5pPIssoszQyF4//3DoK2O
# 65Uck5Wggn8O2klETsJ7u8xEehGifgJYi+6I03UuT1j7FnrqVrOzaQoVJOeeStPe
# ldYRNMmSF3voIgMFtNGh86w3ISHNm0IaadCKCkUe2LnwJKa8TIlwCUNVwppwn4D3
# /Pt5pwIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU5Dv88jHt
# /f3X85FxYxlQQ89hjOgwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04w
# IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI2IDEwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQC2e6byyf7NSvjUm0xls/04xjD4fAkOkbnGQi7+
# Wpx81iYxfzViaxSIctuH3KSl5YEYpMuFgGsA31N2D9ATMbfZdw5uaAhuWevQKhDd
# ZIB4NnqcfpfpWQXJiQnDdAElETC+bhSEvNLGbA8DtwUpFMQ4yyYQSPqomT92osQA
# v6hBi47ATZS6JfVWe6XxhF4jJZ3iSAuf2Cros1czRSmWRHqMv9AfGZvp8ygYElhu
# dpQjtcPpwoOl6QrZJUyV3iINvN4cO05prGV0fkjG426xDr2d3z9lcSIHkdvGPdGU
# rXdxfVbgOUVcp2/8ISEzwKPW++Wa+E2ujI91EZtukGWDJ/xZ27k3oHKEXBRGfRTq
# jOU+jE3ba/5++JSE/7oNHnjs5mekExYN96LV/mxUbCKJb8pBNY4r3uD7hEmk/M81
# XhVgwDA7aMzYC3LZBg9WY5BMmbSay5ecmtJuXaB/0nKWmQmVZeqTVDgsmzHP5MQu
# hAJkiWNuC9MmCg9TZHXbJ2/yLVSov9p16UDTLtT0+aa1vN71fHeu1qMLlLNB3WOB
# /ADCxr3S/1hxI92Z6jKgEED/btwIvbfuXkNNhg8MtDg43c4tMZae9FvqMOt/9Pvm
# AxF9TNIsIFB8G6yb36ZJZGUL8N/pL971DyLXcK6HM5PYnH5X+eVtczhCgHCVQCF6
# XDAlPQIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUFMljijAu
# 1Er7bpTz5uNAfvXszeIwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04w
# DgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMIGVBggrBgEF
# BQcBAQSBiDCBhTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t
# MF0GCCsGAQUFBzAChlFodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl
@ -300,17 +300,17 @@ exit
# XwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lD
# ZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEuY3Js
# MCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsF
# AAOCAgEAZSqt8RwnBLmuYEHs0QhEnmNAciH45PYiT9s1i6UKtW+FERp8FgXRGQ/Y
# AavXzWjZhY+hIfP2JkQ38U+wtJPBVBajYfrbIYG+Dui4I4PCvHpQuPqFgqp1PzC/
# ZRX4pvP/ciZmUnthfAEP1HShTrY+2DE5qjzvZs7JIIgt0GCFD9ktx0LxxtRQ7vll
# KluHWiKk6FxRPyUPxAAYH2Vy1lNM4kzekd8oEARzFAWgeW3az2xejEWLNN4eKGxD
# J8WDl/FQUSntbjZ80FU3i54tpx5F/0Kr15zW/mJAxZMVBrTE2oi0fcI8VMbtoRAm
# aaslNXdCG1+lqvP4FbrQ6IwSBXkZagHLhFU9HCrG/syTRLLhAezu/3Lr00GrJzPQ
# FnCEH1Y58678IgmfORBPC1JKkYaEt2OdDh4GmO0/5cHelAK2/gTlQJINqDr6Jfwy
# YHXSd+V08X1JUPvB4ILfJdmL+66Gp3CSBXG6IwXMZUXBhtCyIaehr0XkBoDIGMUG
# 1dUtwq1qmcwbdUfcSYCn+OwncVUXf53VJUNOaMWMts0VlRYxe5nK+At+DI96HAlX
# HAL5SlfYxJ7La54i71McVWRP66bW+yERNpbJCjyCYG2j+bdpxo/1Cy4uPcU3AWVP
# Grbn5PhDBf3Froguzzhk++ami+r3Qrx5bIbY3TVzgiFI7Gq3zWcxggU2MIIFMgIB
# AAOCAgEAjcU6YR6dUgrfmawJgH59KECxa9Ji8sEi2g10CBDaMiqsaxWyW5cwlT/6
# ZF5sFznazqVsoC85U9dqLOYqQwst+UQQoNlDHgKRLa3xoc+OReFreFhnTXSG0Vrd
# 2E2CZqUfm+5a+He1MJ/h+tNLuA+0Zzhn/Fo+FDYAHWZHx4R79ZsfRFYe9UiXpXBD
# f6DkUo183Y38NYmR/XfDYf7YZ+oR9t3flbDwK+hgGMs0gNNp1w9Z2CyOyI5or/sS
# womAuNQ0hWC9xoU4stD8aWsD7RkcmgVRs6vlIk3zPKQ+ylcheWkMlj+CoVRlFE55
# pv0ZWCaFt04lwP/rdGHE9qEVQZtyRE42ox7oNgC/r+Y4bSlZ3dw9K2x1xLtu6PkP
# KeLBFjzKigwfqm3Hm+k/+lnME8F5kPZTgiy2HLEHklpryqs6QHnPXrRNeIzkAMyy
# lnRN8P0wmirS0WkU+ywpEWFZ4QNg+9xS43tTuW9x0eXh7NDc1P/sV+zWxHXKH8tF
# t1ncHdVzqrZaYPyYMLSn2TOXajveJW1L3joiQSPsWRGxkbDDW15jERFE4LvjnGu2
# O9zD1nLJSMdlYZEikl4w2w+q4IN/R+TIe0H4ngCI1moJCTbevGH4punIxM1Uoi0n
# mX3ZK+XbRT01uowE5ViXWHng0RgsmrX/EdYUo80r3TfMlkD0/YMxggU2MIIFMgIB
# ATBrMGYxCzAJBgNVBAYTAkJFMRIwEAYDVQQIEwlBbnR3ZXJwZW4xDDAKBgNVBAcT
# A01vbDEPMA0GA1UEChMGU0NLQ0VOMQwwCgYDVQQLEwNJQ1QxFjAUBgNVBAMTDVND
# S0NFTiBJQ1QgQ0ECAR8wCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKA
@ -324,19 +324,19 @@ exit
# AyOh+D+wJ7dGcIdscMeF5p3SvqnyWFumMhzYNuKCm6BJJeWMIfOhggMmMIIDIgYJ
# KoZIhvcNAQkGMYIDEzCCAw8CAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAKgO8YS43xBYLRxHan
# lXRoMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTAzMTExMjUyWjAvBgkqhkiG9w0BCQQxIgQgTGPs
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAIT9wzT35FTtvDD4/5
# khg1MA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTA0MTY1MDU1WjAvBgkqhkiG9w0BCQQxIgQgTGPs
# FQqQd9/aeqf+k/SnUJpze+872YJTIc/3H1ODCfAwDQYJKoZIhvcNAQEBBQAEggIA
# r3SpDQuigHX+t7efNOKBspol4EpBrrj5PWAHMs4tBQJv519iH9wFOPDQVlDY+qJ4
# xahckV+a1qW0+W0IE/oVNwOHA7mSabQ9u7Uw3pv3s88WSKL5C9VFipvWqJ0p93wa
# u7Lusg3vLyLiph9kluG28AYKBHNeeABrd8o33qZkwokg2JNKhEasCj4ZTNaDhmyo
# W7FoQkJuIJN/RzLFFQfGy72L+jlckE1H7hdxucP0/+Mz5dNtMBrajA3A1DPqGq7Z
# ICn7vzvqgtuvtsLD5rVq7QmUNRfwIvB25PUi/W6YWruA2ZfpDYhCQb6WgekBH440
# Xt9YgnMAp4qEHuY8P5ncYfC7EM4WhjGG6RN9/6H/vQXhlXbj9PEyhEzKrVuItkAF
# m/gdAJq9LLyJp+rcphKXDVIxpnjVU6cjVdnddDq12ENxvftOUC4IwC8k+IlyCU2g
# I59AkiuQh1LMnINviFCvkva7pfVITCaL8xp5iUM31L3ZRl0WHlPb/RsrbfYd0IKX
# tePVzNxPcxt2PvoJ4X2AxN3na7pci83vjI4q+IJCCp9PVRiuYysBzHekATZC6pRm
# j8HW8G5C8x065B5UyS+RmKkmEZm2s4zltpJdGFblUK0R4eODwjl9pPZ0wUHYtw73
# BJZFdKyygfl9b4Cfpu3HB0pqbOXvQuQLH17iURzu2XE=
# BKPII3VnA9ndlOYjRKbPdUfixo0rBdvBs7vziUDctqkQWzuFH5Ee/Ed9O+k0hSOI
# uMf350aq5B38bb6yvdXticDBnboIkqo62xx90/VNTPuoqKcgt2KnbZU01d7UR7bj
# vJbPMzmZ3gUcyPvlH08JXfgusTDkek218mhDG2jeXnT4IknOFmo3eWJwJaNSmi9X
# o120ar9lfQzopWdbIY6K5I3YPeHoiCSDo2oUk5ya+xeIsJ8faw9fkUSRFYwim73l
# T0xOipzRVK3qbnTQAkNKpQdVhPGaNBk2Uz9V3b2hJJkfakFiqH+K42jidljpof+0
# CApej7ZjPCsxqR0m2xKYOMu01gpajJ9o7uRXEEaiG/eK8UOrc8TfAYLNwTqacjgx
# LLF4MfvFr+TwpYlL39px1a9iaugtxLA+XquqWvnicK/L/IOhTw6wDYzGLD0QxhcJ
# T14QF9NUw2kzuyf7+l+A2yCbjKege8UogEFRmBk1a9uFoHau4bu2nZRPwBq5Zzti
# 62MD4Md3dh1QLpmzwO4HsurprhzduL+a0aIt/NkH/egz9sc9/9N8XAJv3NdBsBVq
# nMDGJ3cLvOUGKBbDLzdps24NCAnHGhc0y7/FV95lyKnLDL4EV9Uzq8jZyt0VC8C2
# iydF5ojJm2UYNYwKwO1F0ZVzpyzsKoz1OJY2MBzhIp4=
# SIG # End signature block

View file

@ -277,25 +277,25 @@ exit
# FLFk43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAvjSabnf7+Pu0VrFgoiovRDiyx
# 3zEdmcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3JE3rYkrhLULy7Dc90G6e8Blqm
# yIjlgp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM1pD2T7m3XDCCBu0wggTVoAMC
# AQICEAqA7xhLjfEFgtHEdqeVdGgwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMC
# AQICEAhP3DNPfkVO28MPj/mSGDUwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMC
# VVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBU
# cnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMTAe
# Fw0yNTA2MDQwMDAwMDBaFw0zNjA5MDMyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# Fw0yNjA4MDUwMDAwMDBaFw0zNzExMDQyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgU0hBMjU2
# IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI1IDEwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQDQRqwtEsae0OquYFazK1e6b1H/hnAKAd/KN8wZ
# QjBjMqiZ3xTWcfsLwOvRxUwXcGx8AUjni6bz52fGTfr6PHRNv6T7zsf1Y/E3IU8k
# gNkeECqVQ+3bzWYesFtkepErvUSbf+EIYLkrLKd6qJnuzK8Vcn0DvbDMemQFoxQ2
# Dsw4vEjoT1FpS54dNApZfKY61HAldytxNM89PZXUP/5wWWURK+IfxiOg8W9lKMqz
# dIo7VA1R0V3Zp3DjjANwqAf4lEkTlCDQ0/fKJLKLkzGBTpx6EYevvOi7XOc4zyh1
# uSqgr6UnbksIcFJqLbkIXIPbcNmA98Oskkkrvt6lPAw/p4oDSRZreiwB7x9ykrjS
# 6GS3NR39iTTFS+ENTqW8m6THuOmHHjQNC3zbJ6nJ6SXiLSvw4Smz8U07hqF+8CTX
# aETkVWz0dVVZw7knh1WZXOLHgDvundrAtuvz0D3T+dYaNcwafsVCGZKUhQPL1naF
# KBy1p6llN3QgshRta6Eq4B40h5avMcpi54wm0i2ePZD5pPIssoszQyF4//3DoK2O
# 65Uck5Wggn8O2klETsJ7u8xEehGifgJYi+6I03UuT1j7FnrqVrOzaQoVJOeeStPe
# ldYRNMmSF3voIgMFtNGh86w3ISHNm0IaadCKCkUe2LnwJKa8TIlwCUNVwppwn4D3
# /Pt5pwIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU5Dv88jHt
# /f3X85FxYxlQQ89hjOgwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04w
# IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI2IDEwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQC2e6byyf7NSvjUm0xls/04xjD4fAkOkbnGQi7+
# Wpx81iYxfzViaxSIctuH3KSl5YEYpMuFgGsA31N2D9ATMbfZdw5uaAhuWevQKhDd
# ZIB4NnqcfpfpWQXJiQnDdAElETC+bhSEvNLGbA8DtwUpFMQ4yyYQSPqomT92osQA
# v6hBi47ATZS6JfVWe6XxhF4jJZ3iSAuf2Cros1czRSmWRHqMv9AfGZvp8ygYElhu
# dpQjtcPpwoOl6QrZJUyV3iINvN4cO05prGV0fkjG426xDr2d3z9lcSIHkdvGPdGU
# rXdxfVbgOUVcp2/8ISEzwKPW++Wa+E2ujI91EZtukGWDJ/xZ27k3oHKEXBRGfRTq
# jOU+jE3ba/5++JSE/7oNHnjs5mekExYN96LV/mxUbCKJb8pBNY4r3uD7hEmk/M81
# XhVgwDA7aMzYC3LZBg9WY5BMmbSay5ecmtJuXaB/0nKWmQmVZeqTVDgsmzHP5MQu
# hAJkiWNuC9MmCg9TZHXbJ2/yLVSov9p16UDTLtT0+aa1vN71fHeu1qMLlLNB3WOB
# /ADCxr3S/1hxI92Z6jKgEED/btwIvbfuXkNNhg8MtDg43c4tMZae9FvqMOt/9Pvm
# AxF9TNIsIFB8G6yb36ZJZGUL8N/pL971DyLXcK6HM5PYnH5X+eVtczhCgHCVQCF6
# XDAlPQIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUFMljijAu
# 1Er7bpTz5uNAfvXszeIwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04w
# DgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMIGVBggrBgEF
# BQcBAQSBiDCBhTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t
# MF0GCCsGAQUFBzAChlFodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl
@ -303,17 +303,17 @@ exit
# XwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lD
# ZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEuY3Js
# MCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsF
# AAOCAgEAZSqt8RwnBLmuYEHs0QhEnmNAciH45PYiT9s1i6UKtW+FERp8FgXRGQ/Y
# AavXzWjZhY+hIfP2JkQ38U+wtJPBVBajYfrbIYG+Dui4I4PCvHpQuPqFgqp1PzC/
# ZRX4pvP/ciZmUnthfAEP1HShTrY+2DE5qjzvZs7JIIgt0GCFD9ktx0LxxtRQ7vll
# KluHWiKk6FxRPyUPxAAYH2Vy1lNM4kzekd8oEARzFAWgeW3az2xejEWLNN4eKGxD
# J8WDl/FQUSntbjZ80FU3i54tpx5F/0Kr15zW/mJAxZMVBrTE2oi0fcI8VMbtoRAm
# aaslNXdCG1+lqvP4FbrQ6IwSBXkZagHLhFU9HCrG/syTRLLhAezu/3Lr00GrJzPQ
# FnCEH1Y58678IgmfORBPC1JKkYaEt2OdDh4GmO0/5cHelAK2/gTlQJINqDr6Jfwy
# YHXSd+V08X1JUPvB4ILfJdmL+66Gp3CSBXG6IwXMZUXBhtCyIaehr0XkBoDIGMUG
# 1dUtwq1qmcwbdUfcSYCn+OwncVUXf53VJUNOaMWMts0VlRYxe5nK+At+DI96HAlX
# HAL5SlfYxJ7La54i71McVWRP66bW+yERNpbJCjyCYG2j+bdpxo/1Cy4uPcU3AWVP
# Grbn5PhDBf3Froguzzhk++ami+r3Qrx5bIbY3TVzgiFI7Gq3zWcxggU2MIIFMgIB
# AAOCAgEAjcU6YR6dUgrfmawJgH59KECxa9Ji8sEi2g10CBDaMiqsaxWyW5cwlT/6
# ZF5sFznazqVsoC85U9dqLOYqQwst+UQQoNlDHgKRLa3xoc+OReFreFhnTXSG0Vrd
# 2E2CZqUfm+5a+He1MJ/h+tNLuA+0Zzhn/Fo+FDYAHWZHx4R79ZsfRFYe9UiXpXBD
# f6DkUo183Y38NYmR/XfDYf7YZ+oR9t3flbDwK+hgGMs0gNNp1w9Z2CyOyI5or/sS
# womAuNQ0hWC9xoU4stD8aWsD7RkcmgVRs6vlIk3zPKQ+ylcheWkMlj+CoVRlFE55
# pv0ZWCaFt04lwP/rdGHE9qEVQZtyRE42ox7oNgC/r+Y4bSlZ3dw9K2x1xLtu6PkP
# KeLBFjzKigwfqm3Hm+k/+lnME8F5kPZTgiy2HLEHklpryqs6QHnPXrRNeIzkAMyy
# lnRN8P0wmirS0WkU+ywpEWFZ4QNg+9xS43tTuW9x0eXh7NDc1P/sV+zWxHXKH8tF
# t1ncHdVzqrZaYPyYMLSn2TOXajveJW1L3joiQSPsWRGxkbDDW15jERFE4LvjnGu2
# O9zD1nLJSMdlYZEikl4w2w+q4IN/R+TIe0H4ngCI1moJCTbevGH4punIxM1Uoi0n
# mX3ZK+XbRT01uowE5ViXWHng0RgsmrX/EdYUo80r3TfMlkD0/YMxggU2MIIFMgIB
# ATBrMGYxCzAJBgNVBAYTAkJFMRIwEAYDVQQIEwlBbnR3ZXJwZW4xDDAKBgNVBAcT
# A01vbDEPMA0GA1UEChMGU0NLQ0VOMQwwCgYDVQQLEwNJQ1QxFjAUBgNVBAMTDVND
# S0NFTiBJQ1QgQ0ECAR8wCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKA
@ -327,19 +327,19 @@ exit
# DRiQQoMUPhuL5O+AMDxtwojvemO2WSOVpNBBZL9SPcrX5oXwH0ShggMmMIIDIgYJ
# KoZIhvcNAQkGMYIDEzCCAw8CAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAKgO8YS43xBYLRxHan
# lXRoMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTAzMTExMjUzWjAvBgkqhkiG9w0BCQQxIgQgGtui
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAIT9wzT35FTtvDD4/5
# khg1MA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTA0MTY1MDU1WjAvBgkqhkiG9w0BCQQxIgQgGtui
# 82paX11KDIN86kiIL1XH+uGmvG+Fu6AqHv/faOkwDQYJKoZIhvcNAQEBBQAEggIA
# EaQLB1KDPg5SGxkGaMC32sRDEEweBP08TDdvhEkDmvGUv+fcumFVQ0ir/Zj5TX+2
# koEf6POY3C69MmzbQfbs0iDtKUrgDGnhfNEU+/IMXZq8F3BrTCwlOfgTEAKJHmJD
# u+jaflhbZOW/WFpqxFfkhNVZxeqsbvfiMzwYINoGsl82b993c9QLEJk9nv6d5ZcS
# fJ/CAnEXdUvM5EwSwIUXrTlms2ruUi16xK8PP66jWhRg6EaVcfXR/eoBVvTwdZi4
# aStUp5PatYHXXG8TU0QLdtS3/mb5qni2Xbo/QEC5kWC7VnfpxO7DcFWUMydPGdg7
# N6/+HAcfrlISC/ZGvBWUgfHb0zxzLLvkDSvIvBgYdbDimKgG3r11DjUhlmKsI8Vv
# 9Sz8jrx+uRFeEACJ4DfFLcl1AtfDcYEeEuL8XJfCKNQv+Dr/k0n2x3Cl17rIG9IA
# HV6LVQ3Zxqbb0BNMJ3Sl9h74VNwYooMoJlEB9lDoriy/3L0R3Qt55NhWBisITLdc
# QVlt41+GmAXsenRExnaV/irsN2p/Y03kLgMCucQSeEc4SKVIJAsMkeI3sjbB1D8w
# uMChkY+Z6Rjol4gu/sVPeHG6g7PmTQfzpLZI4DnzOTSBRLd1b3o6ODJXQM/A7qiz
# ow52qCBsIjHW3ElD75F/O45IzKts1X5ttcx0vkoA5hc=
# X4MODMSzMzUmHa7JwHqI94RDwaO5G6ntvXoh96K3j91Xi096QpeNChMRoVlIzvTB
# ftMYqqX/kXya0xq4g3XO4gzY1tjifRKsVX07iZO8HGLBWXVsNs2T2tHFTxAi2Yw5
# QRTepguMZXw5qgMGcwcV2skBFXpzF0p/Qdx7wJYYOLudpAhXWDaTxwEH9nnyDlRX
# QdH5Oadxe8kErmkEuFTNfbeUK4/fZ0B41C4MkHPhhx/qzvYB3cOR7PN7EPghYZ5Q
# 5uj8rwpes12DUdIev/JHO7jMIwKxwgIezg/sWZ2xGAXADuh26T6cpjyL4poBMHom
# SFR6NCBClwMGNdNmno541bD++Xfw+o+H2HU849w5JStzWQ8hvEXPdgbD/ZYERtJT
# aqAXGiLlcTk1Sv5EkYbqRnsyt4G/3A3vyQBG3IEYRafLtG0FNXbdiJynU+RY8w1O
# l3Aq8DJJsq2Kp3AfQWlcX53gMZm0kMSB59usCDOOV3umTJ197ebEFLFqqq2kvOhV
# QbboZeRRxJjUr4e5oYQTVV/6mm4pCcTA7n8WUl6VjXuc0FHUqKQDt6piTOT4n/6o
# yhkZIN63tJHw4vhBYJwzh1/t2d2Al7wQzjZids3P/cyOUgDi6nE2cx11hOhALkve
# +XoH9QVptxzFiWkpiLvxORqjAa3rGbaoZ1+lbUx2D14=
# SIG # End signature block

View file

@ -141,25 +141,25 @@ exit
# FLFk43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAvjSabnf7+Pu0VrFgoiovRDiyx
# 3zEdmcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3JE3rYkrhLULy7Dc90G6e8Blqm
# yIjlgp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM1pD2T7m3XDCCBu0wggTVoAMC
# AQICEAqA7xhLjfEFgtHEdqeVdGgwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMC
# AQICEAhP3DNPfkVO28MPj/mSGDUwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMC
# VVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBU
# cnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMTAe
# Fw0yNTA2MDQwMDAwMDBaFw0zNjA5MDMyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# Fw0yNjA4MDUwMDAwMDBaFw0zNzExMDQyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgU0hBMjU2
# IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI1IDEwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQDQRqwtEsae0OquYFazK1e6b1H/hnAKAd/KN8wZ
# QjBjMqiZ3xTWcfsLwOvRxUwXcGx8AUjni6bz52fGTfr6PHRNv6T7zsf1Y/E3IU8k
# gNkeECqVQ+3bzWYesFtkepErvUSbf+EIYLkrLKd6qJnuzK8Vcn0DvbDMemQFoxQ2
# Dsw4vEjoT1FpS54dNApZfKY61HAldytxNM89PZXUP/5wWWURK+IfxiOg8W9lKMqz
# dIo7VA1R0V3Zp3DjjANwqAf4lEkTlCDQ0/fKJLKLkzGBTpx6EYevvOi7XOc4zyh1
# uSqgr6UnbksIcFJqLbkIXIPbcNmA98Oskkkrvt6lPAw/p4oDSRZreiwB7x9ykrjS
# 6GS3NR39iTTFS+ENTqW8m6THuOmHHjQNC3zbJ6nJ6SXiLSvw4Smz8U07hqF+8CTX
# aETkVWz0dVVZw7knh1WZXOLHgDvundrAtuvz0D3T+dYaNcwafsVCGZKUhQPL1naF
# KBy1p6llN3QgshRta6Eq4B40h5avMcpi54wm0i2ePZD5pPIssoszQyF4//3DoK2O
# 65Uck5Wggn8O2klETsJ7u8xEehGifgJYi+6I03UuT1j7FnrqVrOzaQoVJOeeStPe
# ldYRNMmSF3voIgMFtNGh86w3ISHNm0IaadCKCkUe2LnwJKa8TIlwCUNVwppwn4D3
# /Pt5pwIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU5Dv88jHt
# /f3X85FxYxlQQ89hjOgwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04w
# IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI2IDEwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQC2e6byyf7NSvjUm0xls/04xjD4fAkOkbnGQi7+
# Wpx81iYxfzViaxSIctuH3KSl5YEYpMuFgGsA31N2D9ATMbfZdw5uaAhuWevQKhDd
# ZIB4NnqcfpfpWQXJiQnDdAElETC+bhSEvNLGbA8DtwUpFMQ4yyYQSPqomT92osQA
# v6hBi47ATZS6JfVWe6XxhF4jJZ3iSAuf2Cros1czRSmWRHqMv9AfGZvp8ygYElhu
# dpQjtcPpwoOl6QrZJUyV3iINvN4cO05prGV0fkjG426xDr2d3z9lcSIHkdvGPdGU
# rXdxfVbgOUVcp2/8ISEzwKPW++Wa+E2ujI91EZtukGWDJ/xZ27k3oHKEXBRGfRTq
# jOU+jE3ba/5++JSE/7oNHnjs5mekExYN96LV/mxUbCKJb8pBNY4r3uD7hEmk/M81
# XhVgwDA7aMzYC3LZBg9WY5BMmbSay5ecmtJuXaB/0nKWmQmVZeqTVDgsmzHP5MQu
# hAJkiWNuC9MmCg9TZHXbJ2/yLVSov9p16UDTLtT0+aa1vN71fHeu1qMLlLNB3WOB
# /ADCxr3S/1hxI92Z6jKgEED/btwIvbfuXkNNhg8MtDg43c4tMZae9FvqMOt/9Pvm
# AxF9TNIsIFB8G6yb36ZJZGUL8N/pL971DyLXcK6HM5PYnH5X+eVtczhCgHCVQCF6
# XDAlPQIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUFMljijAu
# 1Er7bpTz5uNAfvXszeIwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04w
# DgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMIGVBggrBgEF
# BQcBAQSBiDCBhTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t
# MF0GCCsGAQUFBzAChlFodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl
@ -167,17 +167,17 @@ exit
# XwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lD
# ZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEuY3Js
# MCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsF
# AAOCAgEAZSqt8RwnBLmuYEHs0QhEnmNAciH45PYiT9s1i6UKtW+FERp8FgXRGQ/Y
# AavXzWjZhY+hIfP2JkQ38U+wtJPBVBajYfrbIYG+Dui4I4PCvHpQuPqFgqp1PzC/
# ZRX4pvP/ciZmUnthfAEP1HShTrY+2DE5qjzvZs7JIIgt0GCFD9ktx0LxxtRQ7vll
# KluHWiKk6FxRPyUPxAAYH2Vy1lNM4kzekd8oEARzFAWgeW3az2xejEWLNN4eKGxD
# J8WDl/FQUSntbjZ80FU3i54tpx5F/0Kr15zW/mJAxZMVBrTE2oi0fcI8VMbtoRAm
# aaslNXdCG1+lqvP4FbrQ6IwSBXkZagHLhFU9HCrG/syTRLLhAezu/3Lr00GrJzPQ
# FnCEH1Y58678IgmfORBPC1JKkYaEt2OdDh4GmO0/5cHelAK2/gTlQJINqDr6Jfwy
# YHXSd+V08X1JUPvB4ILfJdmL+66Gp3CSBXG6IwXMZUXBhtCyIaehr0XkBoDIGMUG
# 1dUtwq1qmcwbdUfcSYCn+OwncVUXf53VJUNOaMWMts0VlRYxe5nK+At+DI96HAlX
# HAL5SlfYxJ7La54i71McVWRP66bW+yERNpbJCjyCYG2j+bdpxo/1Cy4uPcU3AWVP
# Grbn5PhDBf3Froguzzhk++ami+r3Qrx5bIbY3TVzgiFI7Gq3zWcxggU2MIIFMgIB
# AAOCAgEAjcU6YR6dUgrfmawJgH59KECxa9Ji8sEi2g10CBDaMiqsaxWyW5cwlT/6
# ZF5sFznazqVsoC85U9dqLOYqQwst+UQQoNlDHgKRLa3xoc+OReFreFhnTXSG0Vrd
# 2E2CZqUfm+5a+He1MJ/h+tNLuA+0Zzhn/Fo+FDYAHWZHx4R79ZsfRFYe9UiXpXBD
# f6DkUo183Y38NYmR/XfDYf7YZ+oR9t3flbDwK+hgGMs0gNNp1w9Z2CyOyI5or/sS
# womAuNQ0hWC9xoU4stD8aWsD7RkcmgVRs6vlIk3zPKQ+ylcheWkMlj+CoVRlFE55
# pv0ZWCaFt04lwP/rdGHE9qEVQZtyRE42ox7oNgC/r+Y4bSlZ3dw9K2x1xLtu6PkP
# KeLBFjzKigwfqm3Hm+k/+lnME8F5kPZTgiy2HLEHklpryqs6QHnPXrRNeIzkAMyy
# lnRN8P0wmirS0WkU+ywpEWFZ4QNg+9xS43tTuW9x0eXh7NDc1P/sV+zWxHXKH8tF
# t1ncHdVzqrZaYPyYMLSn2TOXajveJW1L3joiQSPsWRGxkbDDW15jERFE4LvjnGu2
# O9zD1nLJSMdlYZEikl4w2w+q4IN/R+TIe0H4ngCI1moJCTbevGH4punIxM1Uoi0n
# mX3ZK+XbRT01uowE5ViXWHng0RgsmrX/EdYUo80r3TfMlkD0/YMxggU2MIIFMgIB
# ATBrMGYxCzAJBgNVBAYTAkJFMRIwEAYDVQQIEwlBbnR3ZXJwZW4xDDAKBgNVBAcT
# A01vbDEPMA0GA1UEChMGU0NLQ0VOMQwwCgYDVQQLEwNJQ1QxFjAUBgNVBAMTDVND
# S0NFTiBJQ1QgQ0ECAR8wCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKA
@ -191,19 +191,19 @@ exit
# XD2gSs7Z6Eb6BSIoZCt/cBKCOnFUaLgQq/SAOkStq8fpy0QqiGShggMmMIIDIgYJ
# KoZIhvcNAQkGMYIDEzCCAw8CAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAKgO8YS43xBYLRxHan
# lXRoMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTAzMTExMjUzWjAvBgkqhkiG9w0BCQQxIgQg6Tgk
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAIT9wzT35FTtvDD4/5
# khg1MA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMjYwOTA0MTY1MDU2WjAvBgkqhkiG9w0BCQQxIgQg6Tgk
# d9vgRJTrKaa/aNqr0ugqtMxl17/Df7q35ywcJSEwDQYJKoZIhvcNAQEBBQAEggIA
# tyaGUCGWqWMV8PeXbu3yHvT4lZSWml67+MsfID7dW0/sW80hv20sQ+ZOqxwh2Luy
# 590Na+bdqLlx8HIkdZ1jVMI72Orh86kSv7D2lwpnOplbpyYv63ktDVJJQMzkIOS7
# KEuZf9NjjKpRXg4OemhLdXG6AH7Pv7ECN9AVCIEAyoL6Hm9ZbRYztJyNwOoZyItC
# TjOvoM69AEelwdWRymLMBt7v+H6leukG7UcT709NQtqbY4oZiqt3V/XQrYvl4cLV
# 55gJJ7LA3LFEW7WZ0+sJPTyXhpcyTwZ2JExJSre26eNSSqL6+nG2B5cSwcsdKHkn
# D30+GAPW94sjfz3nBomV29lC2c52GV72VVKZ5z0Sv+vng2DnYNZV5xeTl5GPmDQ2
# LyPoIQzBmwrvZEvihhrMUeBt0iQb+d4jUxsluLFDRHhTvAYqX0cAxmd7C9cJAosO
# dP9iN1Czb96NLkkl5u5nppJqodqj3jnXuSkQECmkcj1sq/JicxwydFJu29FYiyud
# EmURQrvWbRNABm/e8SoPv5y467nEWmh7ilLb1CoRWgABxeRTnpU+BvYjsflUNFv/
# UChDj4sBMGluvRMPnFH7biVkpRYsw/6B6WRphxjMV8YgauyHq8CkPAxdbovUyIOl
# PJxWg50AbqWcFZMNGeHLDbjh4JmHH/zlN8e3Ix9THGc=
# BgbZMLNGTsjWjvwEjUaKo26eIfHd9tNiD6wXx2MRBlf11BVLkoI1EOKYgrtuYIXQ
# gHu7c5uXfczud5LHco+jYCfFNglJz9ynnLIx1pxy3BUwTz5G00P9uOgDfEp1aRp+
# unpEKTcgSstG8YesmPhaJEBQjDzukWcjzCKAi77gv/fw1kWvranH5a82LAoM/pSS
# lqWFQzj+tl+fRYINg/M6ByljEhO612hfRtJjsy/IUNzzjnuclJkrKZt2mAeE9bgc
# qtNjCA9otR4OOHlqW+zTUfmm+W8bzXEeq/6ZNB9pzq9f5JVf7Eq956nGb0F87Lqz
# 2GkxZigJns2adlHhale9JUgUVuR/U8zwjr79ZNGYWAIAJEzlRc6OYYYpab/MZIh5
# uYWu6VIa0g6G/15e/KynsowUokqNoXlqclJGc5/VL907Oz5RUVFR/INjC06SV1DJ
# EZ696Ald4UaaCJ6AoJIBLPBBBoytOAnsPA2KeXVInCgGQqbPi7pyXsTrHZ6GtbAB
# EO0kXgqcjVpGfKSJ438AckR7SzCWodHGjObtK3c0hKEqB0+DfVEgyAADXpp97kji
# OE3hc5e9Jix9MaRQlBdb0HbwQ8WmHA4PPgxPM+y3BGEUNHw9BYdKwfOAVfkaGGfz
# gN/DjeRolNsaiCdGfEPM5dLPD8JiaJKo7jaszVeRsw4=
# SIG # End signature block