Simplify Active Setup custom action names

The "ca" prefix is redundant.
This commit is contained in:
Simon Rozman 2018-11-22 11:06:58 +01:00
parent 521b987137
commit dee59f333b
3 changed files with 122 additions and 122 deletions

View File

@ -19,58 +19,42 @@
/** /**
* Publishes Active Setup component * Evaluates Active Setup component state and prepares instructions for
* * PublishActiveSetup deferred action.
* This is a deffered execution action. CustomActionData property should be
* one of:
*
* "install\t<product code>\t<product name>\t<Action Setup component version>"
* Installs Active Setup component
*
* "uninstall\t<product code>"
* Marks Active Setup component as uninstalled
*/ */
var data = Session.Property("CustomActionData").split("\t"); var
if (data && data.length >= 2) { productCode = Session.Property("ProductCode"),
var version;
wsh = new ActiveXObject("WScript.Shell"),
regPath = "HKLM\\Software\\Microsoft\\Active Setup\\Installed Components\\" + data[1] + "\\";
switch (data[0].toLowerCase()) { // Read the current component version from registry. Default to "0".
case "install": try {
if (data.length >= 4) { var wsh = new ActiveXObject("WScript.Shell");
// Register component. version = new String(wsh.RegRead("HKLM\\Software\\Microsoft\\Active Setup\\Installed Components\\" + productCode + "\\" + "Version"));
wsh.RegWrite(regPath, data[2], "REG_SZ"); if (!version || version.length == 0)
wsh.RegWrite(regPath + "Version", data[3], "REG_SZ"); throw new Error("Active Setup component version not found.");
} catch (err) {
// Mark component as installed. version = "0";
wsh.RegWrite(regPath + "IsInstalled", 1, "REG_DWORD");
wsh.RegWrite(regPath + "DontAsk" , 2, "REG_DWORD");
// Set action to execute on user logon.
wsh.RegWrite(regPath + "StubPath", "\"%SystemRoot%\\system32\\msiexec.exe\" /fu \"" + data[1] + "\" /qn", "REG_EXPAND_SZ");
}
break;
case "uninstall":
// Mark component as uninstalled.
wsh.RegWrite(regPath + "IsInstalled", 0, "REG_DWORD");
// We should have set the StubPath to execute cleanup. Unfortunately, when
// the StubPath gets executed, the MSI package is gone already. So, a
// `msiexec /x [ProductCode] /qn` is not possible any more.
wsh.RegDelete(regPath + "StubPath");
break;
}
} }
// Increment the last version component.
var v = version.split(",").slice(0, 4);
v[v.length - 1] = (parseInt(v[v.length - 1], 10) + 1).toString();
version = v.join(",");
// Save the data for deferred action.
Session.Property("PublishActiveSetup") =
(Session.EvaluateCondition("REMOVE=\"ALL\"") == 1/*msiEvaluateConditionTrue*/ ?
["uninstall", productCode] :
["install", productCode, Session.Property("ProductName"), version]
).join("\t");
// SIG // Begin signature block // SIG // Begin signature block
// SIG // MIIWvAYJKoZIhvcNAQcCoIIWrTCCFqkCAQExDzANBglg // SIG // MIIWvAYJKoZIhvcNAQcCoIIWrTCCFqkCAQExDzANBglg
// SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor // SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor
// SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC // SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC
// SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg // SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg
// SIG // Qi9+9yJcVsC2G6qWqsJZUNPauR9SC1GK5YnxOzqhq/ug // SIG // SWSLF8o2K03U8TaA037RPgFhLQkNjuHVIcHTrIoDM/qg
// SIG // ggtpMIIFgTCCBGmgAwIBAgIRAIJkBWOYIGrN1XByRZuP // SIG // ggtpMIIFgTCCBGmgAwIBAgIRAIJkBWOYIGrN1XByRZuP
// SIG // G5IwDQYJKoZIhvcNAQELBQAwfTELMAkGA1UEBhMCR0Ix // SIG // G5IwDQYJKoZIhvcNAQELBQAwfTELMAkGA1UEBhMCR0Ix
// SIG // GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G // SIG // GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
@ -167,23 +151,23 @@ if (data && data.length >= 2) {
// SIG // ZAVjmCBqzdVwckWbjxuSMA0GCWCGSAFlAwQCAQUAoHww // SIG // ZAVjmCBqzdVwckWbjxuSMA0GCWCGSAFlAwQCAQUAoHww
// SIG // EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwG // SIG // EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwG
// SIG // CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG // SIG // CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG
// SIG // AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIAjNaloaL/xM // SIG // AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIAGEfbPfd2yc
// SIG // B0UyKoXYq0egvakd4tV5PYbfbxxFOMcXMA0GCSqGSIb3 // SIG // q3KoaecnqjhrsowXUEfnN+cl+I7EsAaNMA0GCSqGSIb3
// SIG // DQEBAQUABIIBAA9IQVEMX8G91PwyenSfXE3Ib4N/sGGJ // SIG // DQEBAQUABIIBAJ11ijk6V39NHEwz2/OqbpyVJSmHZptq
// SIG // zJ3H6oAwPLXBnZeOKtagG5OZtZ2LMeAtU5E62HEgtWQQ // SIG // W8bnRMxEpumdNxcuvi8fSjRXHYhC3OBJdyqM0YoQjoYU
// SIG // YdHVH+lITGbsS73KRp24k5MzC2TfNzGobGX33X4p4zot // SIG // X7iMyJwMvk5F9on+J0wtL1fnQwHvQG95E/e4VEsKv0Sq
// SIG // W4n2AJ/yjS3dVrpRiJjwfsrNl3fM3CvH/TawgTopqdWp // SIG // aow0QeXY+mm/5MH209cCH0XjnanKVa87eSWIY/eLV7KD
// SIG // 4rRfPcMguzimYwseoXO9P2lg4lQvImvO1XR6HCXXbbuF // SIG // g7HE66e9rZiX/oCyPrUte1DA6c0/+acQzV/2+ag/zolc
// SIG // xuLcfKhgdLnsb2WicwDnDSCA4JxdIPfwGKUkb71LxmQ/ // SIG // S9gKVI1ar3nd/nRrhVUxyCwKAkMCFhi1KLV1MoojIISN
// SIG // uYEHnWk54kdiWCnriQKUIMgaAhBUlktlZOJPl6LhFhZi // SIG // ABHDpxcJnMklp+5CxklfdawvX0gp0C4Xw8jPs1v/RoEh
// SIG // kx4Ve37WQXC7CqPBnnHcRKK0s+fXhCgvvdkcj1X049Ut // SIG // fTt/w08eraaWoNeW9Ir9cTbnySI6sxOM4IVT1AcZDvYN
// SIG // 69KhgghrMIIIZwYKKwYBBAGCNwMDATGCCFcwgghTBgkq // SIG // L/KhgghrMIIIZwYKKwYBBAGCNwMDATGCCFcwgghTBgkq
// SIG // hkiG9w0BBwKggghEMIIIQAIBAzEPMA0GCWCGSAFlAwQC // SIG // hkiG9w0BBwKggghEMIIIQAIBAzEPMA0GCWCGSAFlAwQC
// SIG // AQUAMIIBDwYLKoZIhvcNAQkQAQSggf8EgfwwgfkCAQEG // SIG // AQUAMIIBDwYLKoZIhvcNAQkQAQSggf8EgfwwgfkCAQEG
// SIG // CisGAQQBsjECAQEwMTANBglghkgBZQMEAgEFAAQgSqjE // SIG // CisGAQQBsjECAQEwMTANBglghkgBZQMEAgEFAAQgW5U2
// SIG // oaABn8z8cBD1ly5UDN5KXb2gJpBNzNMg0ur0PJYCFQD7 // SIG // mdsb1u5q2cHxPwFhkAx4uboqBfTFJgBfzAbPTCgCFQCU
// SIG // DGbnRGSjao94Kd4SSbl9ocX3ChgPMjAxODExMjIwOTE3 // SIG // 8P2BcdBMZS1Bqft8ZCMqgIX36hgPMjAxODExMjIxMDA1
// SIG // MjZaoIGMpIGJMIGGMQswCQYDVQQGEwJHQjEbMBkGA1UE // SIG // NTJaoIGMpIGJMIGGMQswCQYDVQQGEwJHQjEbMBkGA1UE
// SIG // CBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdT // SIG // CBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdT
// SIG // YWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRl // SIG // YWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRl
// SIG // ZDEsMCoGA1UEAxMjQ09NT0RPIFNIQS0yNTYgVGltZSBT // SIG // ZDEsMCoGA1UEAxMjQ09NT0RPIFNIQS0yNTYgVGltZSBT
@ -231,16 +215,16 @@ if (data && data.length >= 2) {
// SIG // U0VSRmlyc3QtT2JqZWN0AhBOsIePzCQ1NrLYyfe/OVV3 // SIG // U0VSRmlyc3QtT2JqZWN0AhBOsIePzCQ1NrLYyfe/OVV3
// SIG // MA0GCWCGSAFlAwQCAQUAoIGYMBoGCSqGSIb3DQEJAzEN // SIG // MA0GCWCGSAFlAwQCAQUAoIGYMBoGCSqGSIb3DQEJAzEN
// SIG // BgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMTgx // SIG // BgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMTgx
// SIG // MTIyMDkxNzI2WjArBgsqhkiG9w0BCRACDDEcMBowGDAW // SIG // MTIyMTAwNTUyWjArBgsqhkiG9w0BCRACDDEcMBowGDAW
// SIG // BBQ2Un1Pompo+etFlvHZmrssDqdt+jAvBgkqhkiG9w0B // SIG // BBQ2Un1Pompo+etFlvHZmrssDqdt+jAvBgkqhkiG9w0B
// SIG // CQQxIgQgc9ROfOXHnwYMTogXYqZ2HmJTAZAMdS1YfFck // SIG // CQQxIgQgoGqHEqN/motOUgOkwPZQlfWe2oj8nQmpXQxW
// SIG // SNYjwFUwDQYJKoZIhvcNAQEBBQAEggEAEJ7SnnXSLupt // SIG // IYWsXa4wDQYJKoZIhvcNAQEBBQAEggEAEmHw6kbuV6E3
// SIG // pDgy+6tgNvGsgbWR8Vnwtvjdam0a2FJCh8XvMOEnLpdp // SIG // d0TRW9eKaIH013Skne/SK4e4dprOkGsDgEdjnW9xof18
// SIG // RzvNospGYa4kLlDfxI54OkPEo98u68V4d96z+4fCME/O // SIG // 978puHM6vkr54jkMTMC5RfYXgvwmvKAjFd6zMTrmhp0n
// SIG // kfRlSe0Y1uut7GHi0mdzTUjKbjDTeRq8OUknj/Rj3uRe // SIG // 52lTWov7xGFCR/3aXfStCrRFKYW6INc5laLIs1IK+8G6
// SIG // yObso2iLS4FjBi8YUtSTdKKTqwOHlhMHMUHUZ5Kyem1l // SIG // VBN4tTjh1bCAuZeMD9xuhzbCZ7NtacJn5gBEY51T+6T4
// SIG // nTa2SbHNOvhSKOXkCL/DB8CHdUkYZid4xTq39+2Glum0 // SIG // 5dMsw2U4iFQ9RoeOg+T0KfmeJtfIQrJ93/dPSEZDkkq2
// SIG // E8JbeM1dJIFONIYaIKONCL/FCD5IZsSjyom36O0VrubG // SIG // BU7PiUi17WT4u2YU7EJZzjTGjRn+bRz7oTdMaM1mkUzZ
// SIG // eI1PUr0+bvlD/iDP0X9T1gJGk9CbMPBlFF7ZZhcQP7mE // SIG // o8WpXRZz9m6yRxOgG7aCVQZl4MH/eaowQs7ninN0B5TE
// SIG // VmmmG6JNOE6eJ5EHi9GNwA== // SIG // zxoXoQdxQCCuwVKExwo1BQ==
// SIG // End signature block // SIG // End signature block

View File

@ -19,42 +19,58 @@
/** /**
* Evaluates Active Setup component state and prepares instructions for * Publishes Active Setup component
* caPublishActiveSetup deferred action. *
* This is a deffered execution action. CustomActionData property should be
* one of:
*
* "install\t<product code>\t<product name>\t<Action Setup component version>"
* Installs Active Setup component
*
* "uninstall\t<product code>"
* Marks Active Setup component as uninstalled
*/ */
var var data = Session.Property("CustomActionData").split("\t");
productCode = Session.Property("ProductCode"), if (data && data.length >= 2) {
version; var
wsh = new ActiveXObject("WScript.Shell"),
regPath = "HKLM\\Software\\Microsoft\\Active Setup\\Installed Components\\" + data[1] + "\\";
// Read the current component version from registry. Default to "0". switch (data[0].toLowerCase()) {
try { case "install":
var wsh = new ActiveXObject("WScript.Shell"); if (data.length >= 4) {
version = new String(wsh.RegRead("HKLM\\Software\\Microsoft\\Active Setup\\Installed Components\\" + productCode + "\\" + "Version")); // Register component.
if (!version || version.length == 0) wsh.RegWrite(regPath, data[2], "REG_SZ");
throw new Error("Active Setup component version not found."); wsh.RegWrite(regPath + "Version", data[3], "REG_SZ");
} catch (err) {
version = "0"; // Mark component as installed.
wsh.RegWrite(regPath + "IsInstalled", 1, "REG_DWORD");
wsh.RegWrite(regPath + "DontAsk" , 2, "REG_DWORD");
// Set action to execute on user logon.
wsh.RegWrite(regPath + "StubPath", "\"%SystemRoot%\\system32\\msiexec.exe\" /fu \"" + data[1] + "\" /qn", "REG_EXPAND_SZ");
}
break;
case "uninstall":
// Mark component as uninstalled.
wsh.RegWrite(regPath + "IsInstalled", 0, "REG_DWORD");
// We should have set the StubPath to execute cleanup. Unfortunately, when
// the StubPath gets executed, the MSI package is gone already. So, a
// `msiexec /x [ProductCode] /qn` is not possible any more.
wsh.RegDelete(regPath + "StubPath");
break;
}
} }
// Increment the last version component.
var v = version.split(",").slice(0, 4);
v[v.length - 1] = (parseInt(v[v.length - 1], 10) + 1).toString();
version = v.join(",");
// Save the data for deferred action.
Session.Property("caPublishActiveSetup") =
(Session.EvaluateCondition("REMOVE=\"ALL\"") == 1/*msiEvaluateConditionTrue*/ ?
["uninstall", productCode] :
["install", productCode, Session.Property("ProductName"), version]
).join("\t");
// SIG // Begin signature block // SIG // Begin signature block
// SIG // MIIWuwYJKoZIhvcNAQcCoIIWrDCCFqgCAQExDzANBglg // SIG // MIIWuwYJKoZIhvcNAQcCoIIWrDCCFqgCAQExDzANBglg
// SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor // SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor
// SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC // SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC
// SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg // SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg
// SIG // qLs6xdcTzN5XcXZQEgFJRaZm0g2VNpVyt0hdA7txV06g // SIG // kMMxMz1Ef3Ep3DW9uQLGluhMziYbqAt1jqmtSruYId2g
// SIG // ggtpMIIFgTCCBGmgAwIBAgIRAIJkBWOYIGrN1XByRZuP // SIG // ggtpMIIFgTCCBGmgAwIBAgIRAIJkBWOYIGrN1XByRZuP
// SIG // G5IwDQYJKoZIhvcNAQELBQAwfTELMAkGA1UEBhMCR0Ix // SIG // G5IwDQYJKoZIhvcNAQELBQAwfTELMAkGA1UEBhMCR0Ix
// SIG // GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G // SIG // GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
@ -151,23 +167,23 @@ Session.Property("caPublishActiveSetup") =
// SIG // ZAVjmCBqzdVwckWbjxuSMA0GCWCGSAFlAwQCAQUAoHww // SIG // ZAVjmCBqzdVwckWbjxuSMA0GCWCGSAFlAwQCAQUAoHww
// SIG // EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwG // SIG // EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwG
// SIG // CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG // SIG // CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG
// SIG // AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIHig0/VDN/Xa // SIG // AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIK2hWUgvD9rV
// SIG // MiBDQCvu7tgVzz74vtOOoy/omeuHczRNMA0GCSqGSIb3 // SIG // bhKYGB6Q+evJNZd3bj/8Zxir+menwUUrMA0GCSqGSIb3
// SIG // DQEBAQUABIIBAGd9kx4p4AFk32Aza7NTH0a0Fl5IIV3J // SIG // DQEBAQUABIIBAMN6iO1euWhgV5eutx/0PxElNc1PUo79
// SIG // uLIcSFOs0rvVFIouFj6LZVnC7H83P9BBSq8o8O7JzVa8 // SIG // Ul/OWrNviMOkjDl5xPKznhhOghjZ5/I2BqmYWZ80U9im
// SIG // um2C0EFvI0R2Myxl/lnX1XCh8G9JVGyD+eue6D+O5Mj0 // SIG // fqpNHyVpE5BVuIrVXytIIdzr7EmZ5OfjUjDJZKI/RV4D
// SIG // qSDfWJ+EuvAUMNmtvQL2t+kzFF0LNa/caz0ZV9Uhng21 // SIG // uz6qUwzCLncguR/Ielw1E2Mc6pvXV34Ku6si5pSr8kLI
// SIG // LUjv9HfHOful+1FUv34Yoprz1YJCllvgRxaDiorMtCda // SIG // 2SbUUUDDv6jeZ0wxRsWTle9j/2ESoTdcuvJueaZ4iGyl
// SIG // ukjpRxYQ+7MfBnLqOJ7cXxq1m7ou6qisyS14IMd3MBVZ // SIG // xnDpXwRx8G+ERlOU8+lbnceqtD4uKf1bG3Qexso04hrA
// SIG // Tm7du4E+Pk0WnnEUc60n9jZNKGMlKkZixhy5rspaSTIB // SIG // 51Yvf7Q79l7uUEN978Se9Kna/ZgE9spGI+Ah351zasT0
// SIG // 3DITXpAwqpYvHgC/S17zIfnzsotVjZCXlSnT/+UAFWe9 // SIG // Wp3w7BhH+R02q5l66VBwC0pkcqzMEulipG6sL7HvOCD9
// SIG // 7eChgghqMIIIZgYKKwYBBAGCNwMDATGCCFYwgghSBgkq // SIG // 3NihgghqMIIIZgYKKwYBBAGCNwMDATGCCFYwgghSBgkq
// SIG // hkiG9w0BBwKggghDMIIIPwIBAzEPMA0GCWCGSAFlAwQC // SIG // hkiG9w0BBwKggghDMIIIPwIBAzEPMA0GCWCGSAFlAwQC
// SIG // AQUAMIIBDgYLKoZIhvcNAQkQAQSggf4EgfswgfgCAQEG // SIG // AQUAMIIBDgYLKoZIhvcNAQkQAQSggf4EgfswgfgCAQEG
// SIG // CisGAQQBsjECAQEwMTANBglghkgBZQMEAgEFAAQg6Fqo // SIG // CisGAQQBsjECAQEwMTANBglghkgBZQMEAgEFAAQgXFjA
// SIG // BjGTUVll2JoIjgn9JLmG1zigXEquVsDUGKGuPJcCFH7J // SIG // TYko6yEcxDIXslOR/w2X2DUqAiBx9/tIBMAZrCACFFs5
// SIG // us8L0fgwdoAtv6URfbNXumOgGA8yMDE4MTEyMjA5MTYy // SIG // Dqa2fwvq/1InjBGgY7lxuzyVGA8yMDE4MTEyMjEwMDU1
// SIG // NFqggYykgYkwgYYxCzAJBgNVBAYTAkdCMRswGQYDVQQI // SIG // NlqggYykgYkwgYYxCzAJBgNVBAYTAkdCMRswGQYDVQQI
// SIG // ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1Nh // SIG // ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1Nh
// SIG // bGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVk // SIG // bGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVk
// SIG // MSwwKgYDVQQDEyNDT01PRE8gU0hBLTI1NiBUaW1lIFN0 // SIG // MSwwKgYDVQQDEyNDT01PRE8gU0hBLTI1NiBUaW1lIFN0
@ -215,16 +231,16 @@ Session.Property("caPublishActiveSetup") =
// SIG // RVJGaXJzdC1PYmplY3QCEE6wh4/MJDU2stjJ9785VXcw // SIG // RVJGaXJzdC1PYmplY3QCEE6wh4/MJDU2stjJ9785VXcw
// SIG // DQYJYIZIAWUDBAIBBQCggZgwGgYJKoZIhvcNAQkDMQ0G // SIG // DQYJYIZIAWUDBAIBBQCggZgwGgYJKoZIhvcNAQkDMQ0G
// SIG // CyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0xODEx // SIG // CyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0xODEx
// SIG // MjIwOTE2MjRaMCsGCyqGSIb3DQEJEAIMMRwwGjAYMBYE // SIG // MjIxMDA1NTZaMCsGCyqGSIb3DQEJEAIMMRwwGjAYMBYE
// SIG // FDZSfU+iamj560WW8dmauywOp236MC8GCSqGSIb3DQEJ // SIG // FDZSfU+iamj560WW8dmauywOp236MC8GCSqGSIb3DQEJ
// SIG // BDEiBCAKpoo7FQiH/YJkrRy120D1yElGyfzhsPemQxPT // SIG // BDEiBCA/IFBbYdDtFY07qVNIgj23YA69JuOdw+bX3OOa
// SIG // QMEzVzANBgkqhkiG9w0BAQEFAASCAQA/RFz0SnZvYzNs // SIG // E9BSgzANBgkqhkiG9w0BAQEFAASCAQAPOp5DglKxgDBU
// SIG // q1FyrP609KBvIYoRJTYGoAya3EIj1yMMHNXypTr1o5S5 // SIG // Q8y7mnMpz9e9qlfTievUzDNtNwlm/TowKLJpDCjpajVV
// SIG // aAL6n5dFc7p77TVimLKs/kRyFW75niuMwaLdMU0eEdFo // SIG // GOOYNMbKCEGVUQm60IJ1JO/UxSvIvqyX4xX+NiMR+mbh
// SIG // MRIDKM2bVPg/BKM8sJPazDln7FEBaO9eGBQ49Cujxomx // SIG // jGMRU3Q+Z8Sdwv1z63yC3EWUoLrJi+odfxEe8rixc+yi
// SIG // jcsvHREi7LyYOVX0hBQQ7kIbwouiW53p2+b7zJ/Nychl // SIG // ksJAnIu9+6/hwlN9Sb0D9xYBzLHUYeOq9wUFkbWyOTMY
// SIG // wVKgLn3vVLIRTJuxeTtdAz0yk8gfP9mPW1BS1QBUdfH6 // SIG // LdyDYL61FDFnPe0mUy8NUVCy9QGzw5NeGNgNwkX6uzLC
// SIG // afla97Y73ZB8wDxYRO122GYefgFYziveghkkoNhp9rtS // SIG // kSqbE3a9gTIJExQqSwtbb+CBrEf3SnOzqmyGDiueTts+
// SIG // uaes3AYg+/rq9/SfWJHQ1PoSkVdYk5PlTdtipEJKA4ac // SIG // hWnswCJ8xHP3hSrebpsEx1jI1xjasbFyCysrp04w6oDB
// SIG // xHkNGthRHyQDEwx2JtjB // SIG // hYaGOyna8VLy+J55igOe
// SIG // End signature block // SIG // End signature block

Binary file not shown.