Support for language MST sub-storage added

This commit is contained in:
Simon Rozman 2016-09-10 09:27:44 +02:00
parent 3356377c2c
commit b06a139164
2 changed files with 411 additions and 267 deletions

271
MSI.js
View File

@ -21,10 +21,6 @@
/*@if (! @__MSI_JS__) @*/ /*@if (! @__MSI_JS__) @*/
/*@set @__MSI_JS__ = true @*/ /*@set @__MSI_JS__ = true @*/
var
msiOpenDatabaseModeReadOnly = 0,
msiOpenDatabaseModeTransact = 1;
var var
msiOpenDatabaseModeReadOnly = 0, // Opens a database read-only, no persistent changes. msiOpenDatabaseModeReadOnly = 0, // Opens a database read-only, no persistent changes.
msiOpenDatabaseModeTransact = 1, // Opens a database read/write in transaction mode. msiOpenDatabaseModeTransact = 1, // Opens a database read/write in transaction mode.
@ -89,6 +85,29 @@ var
msiDoActionStatusSuspend = 4, // Suspended sequence to be resumed later. msiDoActionStatusSuspend = 4, // Suspended sequence to be resumed later.
msiDoActionStatusFinished = 5; // Skip remaining actions. Not an error. msiDoActionStatusFinished = 5; // Skip remaining actions. Not an error.
var
msiTransformValidationNone = 0, // No validation done.
msiTransformValidationLanguage = 1, // Default language must match base database.
msiTransformValidationProduct = 2, // Product must match base database.
msiTransformValidationMajorVer = 8, // Checks major version only.
msiTransformValidationMinorVer = 16, // Checks major and minor version only.
msiTransformValidationUpdateVer = 32, // Checks major, minor, and update versions.
msiTransformValidationLess = 64, // Applied version < base version
msiTransformValidationLessOrEqual = 128, // Applied version <= base version
msiTransformValidationEqual = 256, // Applied version = base version
msiTransformValidationGreaterOrEqual = 512, // Applied version >= base version
msiTransformValidationGreater = 1024, // Applied version > base version
msiTransformValidationUpgradeCode = 2048; // Validates that the transform is the appropriate UpgradeCode.
var
msiTransformErrorNone = 0, // None of the following conditions.
msiTransformErrorAddExistingRow = 1, // Adds a row that already exists.
msiTransformErrorDeleteNonExistingRow = 2, // Deletes a row that does not exist.
msiTransformErrorAddExistingTable = 4, // Adds a table that already exists.
msiTransformErrorDeleteNonExistingTable = 8, // Deletes a table that does not exist.
msiTransformErrorUpdateNonExistingRow = 16, // Updates a row that does not exist.
msiTransformErrorChangeCodepage = 32; // Transform and database code pages do not match and neither code page is neutral.
var var
PID_DICTIONARY = 0, // Special format, not support by SummaryInfo object PID_DICTIONARY = 0, // Special format, not support by SummaryInfo object
PID_CODEPAGE = 1, // VT_I2 PID_CODEPAGE = 1, // VT_I2
@ -180,11 +199,11 @@ function MSIMergeFiles(files, d)
/*@end @*/ /*@end @*/
// SIG // Begin signature block // SIG // Begin signature block
// SIG // MIIZKwYJKoZIhvcNAQcCoIIZHDCCGRgCAQExCzAJBgUr // SIG // MIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQExCzAJBgUr
// SIG // DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB // SIG // DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
// SIG // gjcCAR4wJAIBAQQQEODJBs441BGiowAQS9NQkAIBAAIB // SIG // gjcCAR4wJAIBAQQQEODJBs441BGiowAQS9NQkAIBAAIB
// SIG // AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFIXx99l9UFzb // SIG // AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFAoNsMUS4zuI
// SIG // eb1bjuISTLNHG38UoIIUJTCCA+4wggNXoAMCAQICEH6T // SIG // eyMR+0yL/DcliaIvoIISyDCCA+4wggNXoAMCAQICEH6T
// SIG // 6/t8xk5Z6kuad9QG/DswDQYJKoZIhvcNAQEFBQAwgYsx // SIG // 6/t8xk5Z6kuad9QG/DswDQYJKoZIhvcNAQEFBQAwgYsx
// SIG // CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENh // SIG // CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENh
// SIG // cGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQK // SIG // cGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQK
@ -251,129 +270,117 @@ function MSIMergeFiles(files, d)
// SIG // K/F/Wwk9m1viFsoTgW0ALjgNqCmPLOGy9FqpAa8VnCwv // SIG // K/F/Wwk9m1viFsoTgW0ALjgNqCmPLOGy9FqpAa8VnCwv
// SIG // SRvbIrvD/niUUcOGsYKIXfA9tFGheTMrLnu53CAJE3Hr // SIG // SRvbIrvD/niUUcOGsYKIXfA9tFGheTMrLnu53CAJE3Hr
// SIG // ahlbz+ilMFcsiUk/uc9/yb8+ImhjU5q9aXSsxR08f5Lg // SIG // ahlbz+ilMFcsiUk/uc9/yb8+ImhjU5q9aXSsxR08f5Lg
// SIG // w7wc2AR1MIIFejCCBGKgAwIBAgIQQIeLZ2eQpZcEKJ6U // SIG // w7wc2AR1MIIEzjCCA7agAwIBAgIQMHo2eqo+aIGm+U8I
// SIG // AwIaGzANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMC // SIG // yzs5ZDANBgkqhkiG9w0BAQsFADB/MQswCQYDVQQGEwJV
// SIG // VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYD // SIG // UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24x
// SIG // VQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYD // SIG // HzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsx
// SIG // VQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cu // SIG // MDAuBgNVBAMTJ1N5bWFudGVjIENsYXNzIDMgU0hBMjU2
// SIG // dmVyaXNpZ24uY29tL3JwYSAoYykxMDEuMCwGA1UEAxMl // SIG // IENvZGUgU2lnbmluZyBDQTAeFw0xNTEwMDkwMDAwMDBa
// SIG // VmVyaVNpZ24gQ2xhc3MgMyBDb2RlIFNpZ25pbmcgMjAx // SIG // Fw0xODExMDcyMzU5NTlaMGExCzAJBgNVBAYTAlNJMREw
// SIG // MCBDQTAeFw0xMjA5MjYwMDAwMDBaFw0xNTEwMTEyMzU5 // SIG // DwYDVQQIEwhTbG92ZW5pYTEPMA0GA1UEBxMGS2Ftbmlr
// SIG // NTlaMIG9MQswCQYDVQQGEwJTSTERMA8GA1UECBMIU2xv // SIG // MRYwFAYDVQQKFA1BbWViaXMgZC5vLm8uMRYwFAYDVQQD
// SIG // dmVuaWExDzANBgNVBAcTBkthbW5pazEWMBQGA1UEChQN // SIG // FA1BbWViaXMgZC5vLm8uMIIBIjANBgkqhkiG9w0BAQEF
// SIG // QW1lYmlzIGQuby5vLjE+MDwGA1UECxM1RGlnaXRhbCBJ // SIG // AAOCAQ8AMIIBCgKCAQEAl/LoF3DHaSrIaG1pgBmBwDyl
// SIG // RCBDbGFzcyAzIC0gTWljcm9zb2Z0IFNvZnR3YXJlIFZh // SIG // Yt7sRvIuoEdGr/yMhV9RfUIft+xsTPVQOAirvgG+KUbc
// SIG // bGlkYXRpb24gdjIxGjAYBgNVBAsUEXByb2dyYW1za2Eg // SIG // E3KMnGH+VuK7Y+vYzRp3dYTLinSQz1NKYAELyTdVzmmY
// SIG // b3ByZW1hMRYwFAYDVQQDFA1BbWViaXMgZC5vLm8uMIIB // SIG // mU3LX764yk3ABtSZsZwPoiCy+TXE9ZsCkugB2c7Qp9N/
// SIG // IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9QZF // SIG // O9EjjQDRwZlUa3nLoY96Y3qNPwkCn04ppYiqPeIXTRz8
// SIG // QzscW51y/Ermb72+gkWUJ6ExfOS1UHvNAcefWdFm4yVX // SIG // XBLs4Nl/bD9wymEuNSV75vzobJ7BUYQwRU7lmNL2SwRY
// SIG // wqi8TRT+P5czX+UjKbh77d00CxODQK7rdLb8+EgKybFT // SIG // ENaf0DpdiyFLBsNafHjGYiXQHgNxZUBpj7OoRDNBvMQY
// SIG // /bVfT2y8RMtEdG0qI84ZSwh2POazD0PyiHb9XORN2yKH // SIG // L+LM8OrjhGIK1uGL5CqBD/p81ebeFsAZVxg9hrgnkPVQ
// SIG // ykqLiO+6cJvZXjfNpGqf/LxkXVJvyxaemN1XTR91ohhc // SIG // w77U0LZw8wIDAQABo4IBYjCCAV4wCQYDVR0TBAIwADAO
// SIG // 97bNyGCP0M8PNKRZ6Hr5uKlZyr7QLYoYAkaENYdXHrOc // SIG // BgNVHQ8BAf8EBAMCB4AwKwYDVR0fBCQwIjAgoB6gHIYa
// SIG // l5CmBAIL56Ngc8vIlLF2lLPmDYf1qWrPpJyXfj7p3iUf // SIG // aHR0cDovL3N2LnN5bWNiLmNvbS9zdi5jcmwwZgYDVR0g
// SIG // AewtEpbC5FfhCaeHwgg41NfxhRWCXEBTewLHQJtpSo2k // SIG // BF8wXTBbBgtghkgBhvhFAQcXAzBMMCMGCCsGAQUFBwIB
// SIG // mwv5Q1ZuWMDUjPeuHZ3F/ofBoJTE4wIDAQABo4IBezCC // SIG // FhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggrBgEF
// SIG // AXcwCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwQAYD // SIG // BQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTAT
// SIG // VR0fBDkwNzA1oDOgMYYvaHR0cDovL2NzYzMtMjAxMC1j // SIG // BgNVHSUEDDAKBggrBgEFBQcDAzBXBggrBgEFBQcBAQRL
// SIG // cmwudmVyaXNpZ24uY29tL0NTQzMtMjAxMC5jcmwwRAYD // SIG // MEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zdi5zeW1jZC5j
// SIG // VR0gBD0wOzA5BgtghkgBhvhFAQcXAzAqMCgGCCsGAQUF // SIG // b20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zdi5zeW1jYi5j
// SIG // BwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBh // SIG // b20vc3YuY3J0MB8GA1UdIwQYMBaAFJY7U/B5M5evfYPv
// SIG // MBMGA1UdJQQMMAoGCCsGAQUFBwMDMHEGCCsGAQUFBwEB // SIG // LivMyreGHnJmMB0GA1UdDgQWBBT3B72WgJotdMR/DD09
// SIG // BGUwYzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AudmVy // SIG // J93UkAqfzDANBgkqhkiG9w0BAQsFAAOCAQEAinEvQC+1
// SIG // aXNpZ24uY29tMDsGCCsGAQUFBzAChi9odHRwOi8vY3Nj // SIG // yttKEsqAjt2YufpYlul3OQH17YKbUy4AAiKiAsUXWfTu
// SIG // My0yMDEwLWFpYS52ZXJpc2lnbi5jb20vQ1NDMy0yMDEw // SIG // XRVdkT6CrEYcHyOLaHfe36jVHw8vLIiR2cyEcB3vweyr
// SIG // LmNlcjAfBgNVHSMEGDAWgBTPmanqeyb0S8mOj9fwBSbv // SIG // JnNpt+Za4I/XZMoG/vvCJmSltOj8C/7PRKWklGgynPNe
// SIG // 49KnnTARBglghkgBhvhCAQEEBAMCBBAwFgYKKwYBBAGC // SIG // HI8+0d1vLzRtK77hFeV7CIMIfnpoYThJKTSLxdr0kn+j
// SIG // NwIBGwQIMAYBAQABAf8wDQYJKoZIhvcNAQEFBQADggEB // SIG // M8otfdLN2aDonnxe0Mf+2rkrX8AFIIHPpIXZj2X2VEmk
// SIG // AOMOvRZGpbGuLiIAaqp22r2WAOzxinLpe0O/pJCmBoU0 // SIG // ZdyFINgI+KlJVQY/RY9BFMM2htLAIkNcDP1QVzFajhGH
// SIG // lK/Es/Jyc4Y90QyvvhoSVKoZ2hMQ2Y6N7oSkhHjKo/n8 // SIG // yj+C+UtZQf5PceGYtJHNeq3cm6omjnEfyzi8/NwYFlkW
// SIG // WIQwNvaqZu4JpO9IgH1WkfqJWnpVcaVGPA0uHhuDhPe9 // SIG // hvzJEH3woPqKgUramNFFLD0W5zCCBVkwggRBoAMCAQIC
// SIG // gH6Z6I3HC5GL7sc+z4n0kzy1f3AyD+DihQhD0J/i/sgF // SIG // ED141/l2SWCyYX308B7KhiowDQYJKoZIhvcNAQELBQAw
// SIG // iEaFmwwlJHMv6b4xmERMff050y15k875cdRpeFvSjHko // SIG // gcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
// SIG // IUbY2bfPlnvhWd/4eidkT3KY5Lpm4cqUO20166p2Cjxf // SIG // biwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3Qg
// SIG // i9kEGuDPYEYiX94hQmjWwZfIYxdYdD9f+gVcyPpiMspq // SIG // TmV0d29yazE6MDgGA1UECxMxKGMpIDIwMDYgVmVyaVNp
// SIG // n5QwKHOenweisG6BwXs4H5q45SLx1oJ9PUQwggYKMIIE // SIG // Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
// SIG // 8qADAgECAhBSAOWqJVb8GobtlsnUSzPHMA0GCSqGSIb3 // SIG // eTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMyBQdWJs
// SIG // DQEBBQUAMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO // SIG // aWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
// SIG // VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWdu // SIG // eSAtIEc1MB4XDTEzMTIxMDAwMDAwMFoXDTIzMTIwOTIz
// SIG // IFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA2 // SIG // NTk1OVowfzELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
// SIG // IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg // SIG // bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1h
// SIG // dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNz // SIG // bnRlYyBUcnVzdCBOZXR3b3JrMTAwLgYDVQQDEydTeW1h
// SIG // IDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB // SIG // bnRlYyBDbGFzcyAzIFNIQTI1NiBDb2RlIFNpZ25pbmcg
// SIG // dXRob3JpdHkgLSBHNTAeFw0xMDAyMDgwMDAwMDBaFw0y // SIG // Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
// SIG // MDAyMDcyMzU5NTlaMIG0MQswCQYDVQQGEwJVUzEXMBUG // SIG // AQCXgx4AFq8ssdIIxNdok1FgHnH24ke021hNI2JqtL9a
// SIG // A1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl // SIG // G1H3ow0Yd2i72DarLyFQ2p7z518nTgvCl8gJcJOp2lwN
// SIG // cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRl // SIG // TqQNkaC07BTOkXJULs6j20TpUhs/QTzKSuSqwOg5q1PM
// SIG // cm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2ln // SIG // IdDMz3+b5sLMWGqCFe49Ns8cxZcHJI7xe74xLT1u3LWZ
// SIG // bi5jb20vcnBhIChjKTEwMS4wLAYDVQQDEyVWZXJpU2ln // SIG // Qp9LYZVfHHDuF33bi+VhiXjHaBuvEXgamK7EVUdT2bMy
// SIG // biBDbGFzcyAzIENvZGUgU2lnbmluZyAyMDEwIENBMIIB // SIG // 1qEORkDFl5KK0VOnmVuFNVfT6pNiYSAKxzB3JBFNYoO2
// SIG // IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9SNL // SIG // untogjHuZcrf+dWNsjXcjCtvanJcYISc8gyUXsBWUgBI
// SIG // XqXXirsy6dRX9+/kxyZ+rRmY/qidfZT2NmsQ13WBMH8E // SIG // zNP4pX3eL9cT5DiohNVGuBOGwhud6lo43ZvbAgMBAAGj
// SIG // aH/LK3UezR0IjN9plKc3o5x7gOCZ4e43TV/OOxTuhtTQ // SIG // ggGDMIIBfzAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUH
// SIG // 9Sc1vCULOKeMY50Xowilq7D7zWpigkzVIdob2fHjhDuK // SIG // MAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/
// SIG // Kk+FW5ABT8mndhB/JwN8vq5+fcHd+QW8G0icaefApDw8 // SIG // BAgwBgEB/wIBADBsBgNVHSAEZTBjMGEGC2CGSAGG+EUB
// SIG // QQA+35blxeSUcdZVAccAJkpAPLWhJqkMp22AjpAle8+/ // SIG // BxcDMFIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc3lt
// SIG // PxzrL5b65Yd3xrVWsno7VDBTG99iNP8e0fRakyiF5UwX // SIG // YXV0aC5jb20vY3BzMCgGCCsGAQUFBwICMBwaGmh0dHA6
// SIG // Tn5b/aSTmX/fze+kde/vFfZH5/gZctguNBqmtKdMfr27 // SIG // Ly93d3cuc3ltYXV0aC5jb20vcnBhMDAGA1UdHwQpMCcw
// SIG // Tww9V/Ew1qY2jtaAdtcZLqXNfjQtiQIDAQABo4IB/jCC // SIG // JaAjoCGGH2h0dHA6Ly9zMS5zeW1jYi5jb20vcGNhMy1n
// SIG // AfowEgYDVR0TAQH/BAgwBgEB/wIBADBwBgNVHSAEaTBn // SIG // NS5jcmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF
// SIG // MGUGC2CGSAGG+EUBBxcDMFYwKAYIKwYBBQUHAgEWHGh0 // SIG // BwMDMA4GA1UdDwEB/wQEAwIBBjApBgNVHREEIjAgpB4w
// SIG // dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9jcHMwKgYIKwYB // SIG // HDEaMBgGA1UEAxMRU3ltYW50ZWNQS0ktMS01NjcwHQYD
// SIG // BQUHAgIwHhocaHR0cHM6Ly93d3cudmVyaXNpZ24uY29t // SIG // VR0OBBYEFJY7U/B5M5evfYPvLivMyreGHnJmMB8GA1Ud
// SIG // L3JwYTAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwE // SIG // IwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
// SIG // YTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAHBgUr // SIG // SIb3DQEBCwUAA4IBAQAThRoeaak396C9pK9+HWFT/p2M
// SIG // DgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0 // SIG // XgymdR54FyPd/ewaA1U5+3GVx2Vap44w0kRaYdtwb9oh
// SIG // cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYw // SIG // BcIuc7pJ8dGT/l3JzV4D4ImeP3Qe1/c4i6nWz7s1LzNY
// SIG // NAYDVR0fBC0wKzApoCegJYYjaHR0cDovL2NybC52ZXJp // SIG // qJJW0chNO4LmeYQW/CiwsUfzHaI+7ofZpn+kVqU/rYQu
// SIG // c2lnbi5jb20vcGNhMy1nNS5jcmwwNAYIKwYBBQUHAQEE // SIG // Kd58vKiqoz0EAeq6k6IOUCIpF0yH5DoRX9akJYmbBWsv
// SIG // KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC52ZXJp // SIG // tMkBTCd7C6wZBSKgYBU/2sn7TUyP+3Jnd/0nlMe6NQ6I
// SIG // c2lnbi5jb20wHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsG // SIG // Sf6N/SivShK9DbOXBd5EDBX6NisD3MFQAfGhEV0U5eK9
// SIG // AQUFBwMDMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQDExBW // SIG // J0tUviuEXg+mw3QFCu+Xw4kisR93873NQ9TxTKk/tYuE
// SIG // ZXJpU2lnbk1QS0ktMi04MB0GA1UdDgQWBBTPmanqeyb0 // SIG // r2Ty0BQhMYIEPDCCBDgCAQEwgZMwfzELMAkGA1UEBhMC
// SIG // S8mOj9fwBSbv49KnnTAfBgNVHSMEGDAWgBR/02Wnwt3s // SIG // VVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9u
// SIG // u/AwCfNDOfoCrzMxMzANBgkqhkiG9w0BAQUFAAOCAQEA // SIG // MR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3Jr
// SIG // ViLmNKTEYctIuQGtVqhkD9mMkcS7zAzlrXqgIn/fRzhK // SIG // MTAwLgYDVQQDEydTeW1hbnRlYyBDbGFzcyAzIFNIQTI1
// SIG // LWzRf3EafOxwqbHwT+QPDFP6FV7+dJhJJIWBJhyRFEew // SIG // NiBDb2RlIFNpZ25pbmcgQ0ECEDB6NnqqPmiBpvlPCMs7
// SIG // TGOMu6E01MZF6A2FJnMD0KmMZG3ccZLmRQVgFVlROfxY // SIG // OWQwCQYFKw4DAhoFAKBwMBAGCisGAQQBgjcCAQwxAjAA
// SIG // FGv+1KTteWsIDEFy5zciBgm+I+k/RJoe6WGdzLGQXPw9 // SIG // MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
// SIG // 0o2sQj1lNtS0PUAoj5sQzyMmzEsgy5AfXYxMNMo82OU3 // SIG // AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3
// SIG // 1m+lIL006ybZrg3nxZr3obQhkTNvhuhYuyV8dA5Y/nUb // SIG // DQEJBDEWBBQyQeou6RKrLMp4mrNXV997hbZA3DANBgkq
// SIG // Yz/OMXybjxuWnsVTdoRbnK2R+qztk7pdyCFTwoJTY68S // SIG // hkiG9w0BAQEFAASCAQACRUzU5AoLUzbLCl+xiP7KdhVL
// SIG // DVCHERs9VFKWiiycPZIaCJoFLseTpUiR0zGCBHIwggRu // SIG // gKf/hqViMxvzaNNND8m/dmWKCD1jThKt1FTjwlG70bNo
// SIG // AgEBMIHJMIG0MQswCQYDVQQGEwJVUzEXMBUGA1UEChMO // SIG // YNwq5OgJpGU8nApjvk4JKPcLM9KveUcDLWP4Ays70Ane
// SIG // VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWdu // SIG // /keu4Z3hX+HtgyW3EVKs2BeAjQxE4dCtoA69FHSSr6cn
// SIG // IFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9m // SIG // 5n1oIgkPQMnJhuhthDcNWKwOHh0tNMk/9uuKrFaTuEvd
// SIG // IHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20v // SIG // lI8MhuOUd7lxS6qDOd4V3UTyPphbqwfaQlWP3ULwMjmB
// SIG // cnBhIChjKTEwMS4wLAYDVQQDEyVWZXJpU2lnbiBDbGFz // SIG // YfB70BFkNOb+lHfEfe6yfkPbpW3iovrFQgK7UHyilpkM
// SIG // cyAzIENvZGUgU2lnbmluZyAyMDEwIENBAhBAh4tnZ5Cl // SIG // xYfLnEHVtcYYbA4Km25RfLZysWary5Si3l6Py1A0NWgl
// SIG // lwQonpQDAhobMAkGBSsOAwIaBQCgcDAQBgorBgEEAYI3 // SIG // 7EClueMEoYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0
// SIG // AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB // SIG // AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
// SIG // BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAj // SIG // bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h
// SIG // BgkqhkiG9w0BCQQxFgQUwYmpYbRY+hIuvr9tde4y3QVu // SIG // bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g
// SIG // Jk0wDQYJKoZIhvcNAQEBBQAEggEA4awQwBfLE+/CMUcy // SIG // RzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBd
// SIG // 6Z2QjocSM9X561AM0tV61qC1KkVWExgbJl5A11IRVk0c // SIG // MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI
// SIG // l2765kS3BAdvNLkndnvyWtOwAx4EB1TPKxzc70+VNhMk // SIG // hvcNAQkFMQ8XDTE2MDkxMDA1MTEzM1owIwYJKoZIhvcN
// SIG // 9ei04L34lqOvnZEPKj492hrsnZ+Vv2ogUGl7yJgpmFcr // SIG // AQkEMRYEFDF7MGxDlBmojWCnW+gG5zTydO62MA0GCSqG
// SIG // xUJYnXoAF6UPe8H2/qOQwlyovEO0UEqM++ZDCxH+1Nmk // SIG // SIb3DQEBAQUABIIBAEcYUfnQavkbIbufS9X6+Dif2ed1
// SIG // r/EJ23Q45B27KJvvLeqP7X+h39cq2Gg87MOL2gGThTLO // SIG // pcDq/PTxw+yG0UFkfDxM4IMSfty2UStzi/YMhgu5zse2
// SIG // 3EsK+jSaY9J75EKZWktLoXFA3wadFtDmWm4+ETZRgS3W // SIG // Lk00lWINNxfBsmwuhIZdWOaH8AoHQeIdAe/pp6igYfZF
// SIG // yTGeWFWadQeT+juMJ+dYuvPp8tF78lT0QpUDifQpassi // SIG // q3MiiGPPjCPjAtVDHoQbn6wXBMpsYLrriShJKJiFKCKm
// SIG // bAjQhslJzXO79eq5FaGCAgswggIHBgkqhkiG9w0BCQYx // SIG // S7nEc/HOGcigUTb7VVDsbEsZ9K3i5HV91h6WiVvGY1je
// SIG // ggH4MIIB9AIBATByMF4xCzAJBgNVBAYTAlVTMR0wGwYD // SIG // mogqF3iOumHAW5h4P/ypbvMKFfPXOev3UEmpOnn3gbQd
// SIG // VQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEwMC4GA1UE // SIG // XZwkZKyl36IJ5JqnBtH+tBTSlg915BH8YrleQOOpo864
// SIG // AxMnU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNl // SIG // tcVfj3d7p2ZPsCIVSczXu8ak07D47XoEVN5XPpVMNHCC
// SIG // cyBDQSAtIEcyAhAOz/Q4yP6/NW4E2GqYGxpQMAkGBSsO // SIG // dJFAmKk=
// SIG // AwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcB
// SIG // MBwGCSqGSIb3DQEJBTEPFw0xNTAyMjUwODA3MTVaMCMG
// SIG // CSqGSIb3DQEJBDEWBBRse8MZoWLG1sFme+Yk1wupYmMY
// SIG // WTANBgkqhkiG9w0BAQEFAASCAQCKIG8PB44uTtJRi1AX
// SIG // YWuWrwnq8Zrs5SXJcRTaXi3chvP44chNQcwOifKjzlTF
// SIG // W+tV6NfV1fnkPp2FB/XIATHPUuZtDBr72BmGkIiL1bxE
// SIG // 9YGlslvtngLGCN0oXX3P2aFHKT7V3HFiEKooFRWY7Zgl
// SIG // EWiZSZk4lEvtYDHu4SiubAKMGHojClYRcMXKoTvuBJe5
// SIG // zuVnbCOfi1c7Wy+PmycqRpxJ4WYpv5t58fhM7pA/N8DN
// SIG // g/s08s5e4w0Tf9v6FIaQyagMCbXWFu6/BmrMb1VOC5kU
// SIG // QOT5iOjnJBphPpo1A+EovYPbcETTyvv4bkkfmTg2pX0c
// SIG // 5PHCG+suLWPMM177
// SIG // End signature block // SIG // End signature block

403
MSI.wsf
View File

@ -35,14 +35,16 @@
WScript.Quit(1); WScript.Quit(1);
} }
var
fso = WScript.CreateObject("Scripting.FileSystemObject"),
ddf_path = WScript.Arguments.Unnamed(0);
try { try {
var var
installer = WScript.CreateObject("WindowsInstaller.Installer"), installer = WScript.CreateObject("WindowsInstaller.Installer"),
fso = WScript.CreateObject("Scripting.FileSystemObject"),
input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : null, input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : null,
output_base = WScript.Arguments.Named.Exists("O") ? WScript.Arguments.Named("O") : "Dat", output_base = WScript.Arguments.Named.Exists("O") ? WScript.Arguments.Named("O") : "Dat",
compression = WScript.Arguments.Named.Exists("C") ? WScript.Arguments.Named("C") : "MSZIP", compression = WScript.Arguments.Named.Exists("C") ? WScript.Arguments.Named("C") : "MSZIP",
ddf_path = WScript.Arguments.Unnamed(0),
files = new Array(), files = new Array(),
i, n = WScript.Arguments.Unnamed.length; i, n = WScript.Arguments.Unnamed.length;
@ -54,8 +56,12 @@
msi_path = WScript.Arguments.Unnamed(i), msi_path = WScript.Arguments.Unnamed(i),
d; d;
try {
d = MSIGetFiles(installer, msi_path, input_path); d = MSIGetFiles(installer, msi_path, input_path);
MSIMergeFiles(files, d); MSIMergeFiles(files, d);
} catch (err) {
throw new Error(err.number, "" + msi_path + ": " + err.description);
}
// Force JScript engine to free database and session objects, otherwise opening of another session will fail. // Force JScript engine to free database and session objects, otherwise opening of another session will fail.
CollectGarbage(); CollectGarbage();
@ -121,12 +127,14 @@
WScript.Quit(1); WScript.Quit(1);
} }
var
fso = WScript.CreateObject("Scripting.FileSystemObject"),
dep_path = WScript.Arguments.Unnamed(0);
try { try {
var var
installer = WScript.CreateObject("WindowsInstaller.Installer"), installer = WScript.CreateObject("WindowsInstaller.Installer"),
fso = WScript.CreateObject("Scripting.FileSystemObject"),
input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : null, input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : null,
dep_path = WScript.Arguments.Unnamed(0),
target_path = WScript.Arguments.Unnamed(1), target_path = WScript.Arguments.Unnamed(1),
files = new Array(), files = new Array(),
i, n = WScript.Arguments.Unnamed.length; i, n = WScript.Arguments.Unnamed.length;
@ -172,7 +180,7 @@
<job id="SetCAB"> <job id="SetCAB">
<runtime> <runtime>
<description>Configures MSI package to use external CAB file.</description> <description>Configures MSI package to use external CAB file.</description>
<unnamed name="&lt;output.msi&gt;" helpstring="Output MSI file" required="true"/> <unnamed name="&lt;database.msi&gt;" helpstring="Output MSI file" required="true"/>
<unnamed name="&lt;input.inf&gt;" helpstring="Input INF file" required="true"/> <unnamed name="&lt;input.inf&gt;" helpstring="Input INF file" required="true"/>
<named name="I" helpstring="Input files folder" type="string" required="false"/> <named name="I" helpstring="Input files folder" type="string" required="false"/>
<named name="E" helpstring="Embed CAB file" type="simple" required="false"/> <named name="E" helpstring="Embed CAB file" type="simple" required="false"/>
@ -306,13 +314,154 @@
WScript.Quit(0); WScript.Quit(0);
]]></script> ]]></script>
</job> </job>
<job id="MakeMST">
<runtime>
<description>Build MSI language from differences between two MSI files.</description>
<unnamed name="&lt;source.msi&gt;" helpstring="Original MSI file" required="true"/>
<unnamed name="&lt;destination.msi&gt;" helpstring="Updated MSI file" required="true"/>
<unnamed name="&lt;diff.mst&gt;" helpstring="Output MST file" required="true"/>
</runtime>
<script language="JScript" src="MSI.js"/>
<script language="JScript" src="String.js"/>
<script language="JScript"><![CDATA[
if (WScript.Arguments.Unnamed.Length < 3) {
WScript.Arguments.ShowUsage();
WScript.Quit(1);
}
var
fso = WScript.CreateObject("Scripting.FileSystemObject"),
mst_path = WScript.Arguments.Unnamed(2);
try {
var
installer = WScript.CreateObject("WindowsInstaller.Installer"),
db_src = installer.OpenDatabase(WScript.Arguments.Unnamed(0), msiOpenDatabaseModeReadOnly),
db_dst = installer.OpenDatabase(WScript.Arguments.Unnamed(1), msiOpenDatabaseModeReadOnly);
db_dst.GenerateTransform(db_src, mst_path);
db_dst.CreateTransformSummaryInfo(db_src, mst_path, msiTransformErrorNone, msiTransformValidationNone);
} catch (err) {
// In case of error, delete output file.
if (fso.FileExists(mst_path))
fso.DeleteFile(mst_path);
throw err;
}
WScript.Quit(0);
]]></script>
</job>
<job id="AddStorage">
<runtime>
<description>Adds sub-storage to MSI file.</description>
<unnamed name="&lt;database.msi&gt;" helpstring="MSI database file" required="true"/>
<unnamed name="&lt;transform.mst&gt;" helpstring="MST file to add as a sub-storage" required="true"/>
<unnamed name="&lt;name&gt;" helpstring="Sub-storage name" required="true"/>
</runtime>
<script language="JScript" src="MSI.js"/>
<script language="JScript" src="String.js"/>
<script language="JScript"><![CDATA[
if (WScript.Arguments.Unnamed.Length < 3) {
WScript.Arguments.ShowUsage();
WScript.Quit(1);
}
var
fso = WScript.CreateObject("Scripting.FileSystemObject"),
msi_path = WScript.Arguments.Unnamed(0);
try {
var
installer = WScript.CreateObject("WindowsInstaller.Installer"),
database = installer.OpenDatabase(msi_path, msiOpenDatabaseModeTransact),
view = database.OpenView("SELECT Name,Data FROM _Storages"),
record = installer.CreateRecord(2),
stream_path = WScript.Arguments.Unnamed(1),
stream_name = WScript.Arguments.Unnamed(2);
try {
// Inserts or updates sub-storage.
record.StringData(1) = stream_name;
view.Execute(record);
record.SetStream(2, stream_path);
view.Modify(msiViewModifyAssign, record);
} catch (err) {
throw new Error(err.number, "" + stream_path + ": " + err.description);
}
// Commit database
database.Commit();
} catch (err) {
// In case of error, delete output file.
if (fso.FileExists(msi_path))
fso.DeleteFile(msi_path);
throw err;
}
WScript.Quit(0);
]]></script>
</job>
<job id="SetLangMST">
<runtime>
<description>Sets language transform MST list in MSI file.</description>
<unnamed name="&lt;database.msi&gt;" helpstring="MSI database file" required="true"/>
<unnamed name="&lt;name ...&gt;" helpstring="Sub-storage names of language transform MSTs" required="true"/>
</runtime>
<script language="JScript" src="MSI.js"/>
<script language="JScript" src="String.js"/>
<script language="JScript"><![CDATA[
if (WScript.Arguments.Unnamed.Length < 2) {
WScript.Arguments.ShowUsage();
WScript.Quit(1);
}
var
fso = WScript.CreateObject("Scripting.FileSystemObject"),
msi_path = WScript.Arguments.Unnamed(0);
try {
var
installer = WScript.CreateObject("WindowsInstaller.Installer"),
database = installer.OpenDatabase(msi_path, msiOpenDatabaseModeTransact),
list = "";
// Prepare list of language transforms.
for (var i = 1, n = WScript.Arguments.Unnamed.Length; i < n; i++)
list += (i > 1 ? "," : "") + WScript.Arguments.Unnamed(i);
// Get platform.
var
sumInfo = database.SummaryInformation(1),
template = sumInfo.Property(PID_TEMPLATE),
idx_delim = template.indexOf(";"),
platform = idx_delim >= 0 ? template.substring(0, idx_delim + 1) : ";";
// Set template property.
sumInfo.Property(PID_TEMPLATE) = platform + list;
sumInfo.Persist();
// Commit database
database.Commit();
} catch (err) {
// In case of error, delete output file.
if (fso.FileExists(msi_path))
fso.DeleteFile(msi_path);
throw err;
}
WScript.Quit(0);
]]></script>
</job>
<signature> <signature>
** SIG ** MIIZKwYJKoZIhvcNAQcCoIIZHDCCGRgCAQExCzAJBgUr ** SIG ** MIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQExCzAJBgUr
** SIG ** DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB ** SIG ** DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
** SIG ** gjcCAR4wJAIBAQQQcAVhGs441BGiowAQS9NQkAIBAAIB ** SIG ** gjcCAR4wJAIBAQQQcAVhGs441BGiowAQS9NQkAIBAAIB
** SIG ** AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFOmLvXiSn5as ** SIG ** AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFEHEvk2w1IDu
** SIG ** mKKYx6fTeLBCw9+moIIUJTCCA+4wggNXoAMCAQICEH6T ** SIG ** raRVIFiVLN1o6XuBoIISyDCCA+4wggNXoAMCAQICEH6T
** SIG ** 6/t8xk5Z6kuad9QG/DswDQYJKoZIhvcNAQEFBQAwgYsx ** SIG ** 6/t8xk5Z6kuad9QG/DswDQYJKoZIhvcNAQEFBQAwgYsx
** SIG ** CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENh ** SIG ** CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENh
** SIG ** cGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQK ** SIG ** cGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQK
@ -379,130 +528,118 @@
** SIG ** K/F/Wwk9m1viFsoTgW0ALjgNqCmPLOGy9FqpAa8VnCwv ** SIG ** K/F/Wwk9m1viFsoTgW0ALjgNqCmPLOGy9FqpAa8VnCwv
** SIG ** SRvbIrvD/niUUcOGsYKIXfA9tFGheTMrLnu53CAJE3Hr ** SIG ** SRvbIrvD/niUUcOGsYKIXfA9tFGheTMrLnu53CAJE3Hr
** SIG ** ahlbz+ilMFcsiUk/uc9/yb8+ImhjU5q9aXSsxR08f5Lg ** SIG ** ahlbz+ilMFcsiUk/uc9/yb8+ImhjU5q9aXSsxR08f5Lg
** SIG ** w7wc2AR1MIIFejCCBGKgAwIBAgIQQIeLZ2eQpZcEKJ6U ** SIG ** w7wc2AR1MIIEzjCCA7agAwIBAgIQMHo2eqo+aIGm+U8I
** SIG ** AwIaGzANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMC ** SIG ** yzs5ZDANBgkqhkiG9w0BAQsFADB/MQswCQYDVQQGEwJV
** SIG ** VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYD ** SIG ** UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24x
** SIG ** VQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYD ** SIG ** HzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsx
** SIG ** VQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cu ** SIG ** MDAuBgNVBAMTJ1N5bWFudGVjIENsYXNzIDMgU0hBMjU2
** SIG ** dmVyaXNpZ24uY29tL3JwYSAoYykxMDEuMCwGA1UEAxMl ** SIG ** IENvZGUgU2lnbmluZyBDQTAeFw0xNTEwMDkwMDAwMDBa
** SIG ** VmVyaVNpZ24gQ2xhc3MgMyBDb2RlIFNpZ25pbmcgMjAx ** SIG ** Fw0xODExMDcyMzU5NTlaMGExCzAJBgNVBAYTAlNJMREw
** SIG ** MCBDQTAeFw0xMjA5MjYwMDAwMDBaFw0xNTEwMTEyMzU5 ** SIG ** DwYDVQQIEwhTbG92ZW5pYTEPMA0GA1UEBxMGS2Ftbmlr
** SIG ** NTlaMIG9MQswCQYDVQQGEwJTSTERMA8GA1UECBMIU2xv ** SIG ** MRYwFAYDVQQKFA1BbWViaXMgZC5vLm8uMRYwFAYDVQQD
** SIG ** dmVuaWExDzANBgNVBAcTBkthbW5pazEWMBQGA1UEChQN ** SIG ** FA1BbWViaXMgZC5vLm8uMIIBIjANBgkqhkiG9w0BAQEF
** SIG ** QW1lYmlzIGQuby5vLjE+MDwGA1UECxM1RGlnaXRhbCBJ ** SIG ** AAOCAQ8AMIIBCgKCAQEAl/LoF3DHaSrIaG1pgBmBwDyl
** SIG ** RCBDbGFzcyAzIC0gTWljcm9zb2Z0IFNvZnR3YXJlIFZh ** SIG ** Yt7sRvIuoEdGr/yMhV9RfUIft+xsTPVQOAirvgG+KUbc
** SIG ** bGlkYXRpb24gdjIxGjAYBgNVBAsUEXByb2dyYW1za2Eg ** SIG ** E3KMnGH+VuK7Y+vYzRp3dYTLinSQz1NKYAELyTdVzmmY
** SIG ** b3ByZW1hMRYwFAYDVQQDFA1BbWViaXMgZC5vLm8uMIIB ** SIG ** mU3LX764yk3ABtSZsZwPoiCy+TXE9ZsCkugB2c7Qp9N/
** SIG ** IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9QZF ** SIG ** O9EjjQDRwZlUa3nLoY96Y3qNPwkCn04ppYiqPeIXTRz8
** SIG ** QzscW51y/Ermb72+gkWUJ6ExfOS1UHvNAcefWdFm4yVX ** SIG ** XBLs4Nl/bD9wymEuNSV75vzobJ7BUYQwRU7lmNL2SwRY
** SIG ** wqi8TRT+P5czX+UjKbh77d00CxODQK7rdLb8+EgKybFT ** SIG ** ENaf0DpdiyFLBsNafHjGYiXQHgNxZUBpj7OoRDNBvMQY
** SIG ** /bVfT2y8RMtEdG0qI84ZSwh2POazD0PyiHb9XORN2yKH ** SIG ** L+LM8OrjhGIK1uGL5CqBD/p81ebeFsAZVxg9hrgnkPVQ
** SIG ** ykqLiO+6cJvZXjfNpGqf/LxkXVJvyxaemN1XTR91ohhc ** SIG ** w77U0LZw8wIDAQABo4IBYjCCAV4wCQYDVR0TBAIwADAO
** SIG ** 97bNyGCP0M8PNKRZ6Hr5uKlZyr7QLYoYAkaENYdXHrOc ** SIG ** BgNVHQ8BAf8EBAMCB4AwKwYDVR0fBCQwIjAgoB6gHIYa
** SIG ** l5CmBAIL56Ngc8vIlLF2lLPmDYf1qWrPpJyXfj7p3iUf ** SIG ** aHR0cDovL3N2LnN5bWNiLmNvbS9zdi5jcmwwZgYDVR0g
** SIG ** AewtEpbC5FfhCaeHwgg41NfxhRWCXEBTewLHQJtpSo2k ** SIG ** BF8wXTBbBgtghkgBhvhFAQcXAzBMMCMGCCsGAQUFBwIB
** SIG ** mwv5Q1ZuWMDUjPeuHZ3F/ofBoJTE4wIDAQABo4IBezCC ** SIG ** FhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggrBgEF
** SIG ** AXcwCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwQAYD ** SIG ** BQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTAT
** SIG ** VR0fBDkwNzA1oDOgMYYvaHR0cDovL2NzYzMtMjAxMC1j ** SIG ** BgNVHSUEDDAKBggrBgEFBQcDAzBXBggrBgEFBQcBAQRL
** SIG ** cmwudmVyaXNpZ24uY29tL0NTQzMtMjAxMC5jcmwwRAYD ** SIG ** MEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zdi5zeW1jZC5j
** SIG ** VR0gBD0wOzA5BgtghkgBhvhFAQcXAzAqMCgGCCsGAQUF ** SIG ** b20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zdi5zeW1jYi5j
** SIG ** BwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBh ** SIG ** b20vc3YuY3J0MB8GA1UdIwQYMBaAFJY7U/B5M5evfYPv
** SIG ** MBMGA1UdJQQMMAoGCCsGAQUFBwMDMHEGCCsGAQUFBwEB ** SIG ** LivMyreGHnJmMB0GA1UdDgQWBBT3B72WgJotdMR/DD09
** SIG ** BGUwYzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AudmVy ** SIG ** J93UkAqfzDANBgkqhkiG9w0BAQsFAAOCAQEAinEvQC+1
** SIG ** aXNpZ24uY29tMDsGCCsGAQUFBzAChi9odHRwOi8vY3Nj ** SIG ** yttKEsqAjt2YufpYlul3OQH17YKbUy4AAiKiAsUXWfTu
** SIG ** My0yMDEwLWFpYS52ZXJpc2lnbi5jb20vQ1NDMy0yMDEw ** SIG ** XRVdkT6CrEYcHyOLaHfe36jVHw8vLIiR2cyEcB3vweyr
** SIG ** LmNlcjAfBgNVHSMEGDAWgBTPmanqeyb0S8mOj9fwBSbv ** SIG ** JnNpt+Za4I/XZMoG/vvCJmSltOj8C/7PRKWklGgynPNe
** SIG ** 49KnnTARBglghkgBhvhCAQEEBAMCBBAwFgYKKwYBBAGC ** SIG ** HI8+0d1vLzRtK77hFeV7CIMIfnpoYThJKTSLxdr0kn+j
** SIG ** NwIBGwQIMAYBAQABAf8wDQYJKoZIhvcNAQEFBQADggEB ** SIG ** M8otfdLN2aDonnxe0Mf+2rkrX8AFIIHPpIXZj2X2VEmk
** SIG ** AOMOvRZGpbGuLiIAaqp22r2WAOzxinLpe0O/pJCmBoU0 ** SIG ** ZdyFINgI+KlJVQY/RY9BFMM2htLAIkNcDP1QVzFajhGH
** SIG ** lK/Es/Jyc4Y90QyvvhoSVKoZ2hMQ2Y6N7oSkhHjKo/n8 ** SIG ** yj+C+UtZQf5PceGYtJHNeq3cm6omjnEfyzi8/NwYFlkW
** SIG ** WIQwNvaqZu4JpO9IgH1WkfqJWnpVcaVGPA0uHhuDhPe9 ** SIG ** hvzJEH3woPqKgUramNFFLD0W5zCCBVkwggRBoAMCAQIC
** SIG ** gH6Z6I3HC5GL7sc+z4n0kzy1f3AyD+DihQhD0J/i/sgF ** SIG ** ED141/l2SWCyYX308B7KhiowDQYJKoZIhvcNAQELBQAw
** SIG ** iEaFmwwlJHMv6b4xmERMff050y15k875cdRpeFvSjHko ** SIG ** gcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
** SIG ** IUbY2bfPlnvhWd/4eidkT3KY5Lpm4cqUO20166p2Cjxf ** SIG ** biwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3Qg
** SIG ** i9kEGuDPYEYiX94hQmjWwZfIYxdYdD9f+gVcyPpiMspq ** SIG ** TmV0d29yazE6MDgGA1UECxMxKGMpIDIwMDYgVmVyaVNp
** SIG ** n5QwKHOenweisG6BwXs4H5q45SLx1oJ9PUQwggYKMIIE ** SIG ** Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
** SIG ** 8qADAgECAhBSAOWqJVb8GobtlsnUSzPHMA0GCSqGSIb3 ** SIG ** eTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMyBQdWJs
** SIG ** DQEBBQUAMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO ** SIG ** aWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
** SIG ** VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWdu ** SIG ** eSAtIEc1MB4XDTEzMTIxMDAwMDAwMFoXDTIzMTIwOTIz
** SIG ** IFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA2 ** SIG ** NTk1OVowfzELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
** SIG ** IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg ** SIG ** bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1h
** SIG ** dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNz ** SIG ** bnRlYyBUcnVzdCBOZXR3b3JrMTAwLgYDVQQDEydTeW1h
** SIG ** IDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB ** SIG ** bnRlYyBDbGFzcyAzIFNIQTI1NiBDb2RlIFNpZ25pbmcg
** SIG ** dXRob3JpdHkgLSBHNTAeFw0xMDAyMDgwMDAwMDBaFw0y ** SIG ** Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
** SIG ** MDAyMDcyMzU5NTlaMIG0MQswCQYDVQQGEwJVUzEXMBUG ** SIG ** AQCXgx4AFq8ssdIIxNdok1FgHnH24ke021hNI2JqtL9a
** SIG ** A1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl ** SIG ** G1H3ow0Yd2i72DarLyFQ2p7z518nTgvCl8gJcJOp2lwN
** SIG ** cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRl ** SIG ** TqQNkaC07BTOkXJULs6j20TpUhs/QTzKSuSqwOg5q1PM
** SIG ** cm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2ln ** SIG ** IdDMz3+b5sLMWGqCFe49Ns8cxZcHJI7xe74xLT1u3LWZ
** SIG ** bi5jb20vcnBhIChjKTEwMS4wLAYDVQQDEyVWZXJpU2ln ** SIG ** Qp9LYZVfHHDuF33bi+VhiXjHaBuvEXgamK7EVUdT2bMy
** SIG ** biBDbGFzcyAzIENvZGUgU2lnbmluZyAyMDEwIENBMIIB ** SIG ** 1qEORkDFl5KK0VOnmVuFNVfT6pNiYSAKxzB3JBFNYoO2
** SIG ** IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9SNL ** SIG ** untogjHuZcrf+dWNsjXcjCtvanJcYISc8gyUXsBWUgBI
** SIG ** XqXXirsy6dRX9+/kxyZ+rRmY/qidfZT2NmsQ13WBMH8E ** SIG ** zNP4pX3eL9cT5DiohNVGuBOGwhud6lo43ZvbAgMBAAGj
** SIG ** aH/LK3UezR0IjN9plKc3o5x7gOCZ4e43TV/OOxTuhtTQ ** SIG ** ggGDMIIBfzAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUH
** SIG ** 9Sc1vCULOKeMY50Xowilq7D7zWpigkzVIdob2fHjhDuK ** SIG ** MAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/
** SIG ** Kk+FW5ABT8mndhB/JwN8vq5+fcHd+QW8G0icaefApDw8 ** SIG ** BAgwBgEB/wIBADBsBgNVHSAEZTBjMGEGC2CGSAGG+EUB
** SIG ** QQA+35blxeSUcdZVAccAJkpAPLWhJqkMp22AjpAle8+/ ** SIG ** BxcDMFIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc3lt
** SIG ** PxzrL5b65Yd3xrVWsno7VDBTG99iNP8e0fRakyiF5UwX ** SIG ** YXV0aC5jb20vY3BzMCgGCCsGAQUFBwICMBwaGmh0dHA6
** SIG ** Tn5b/aSTmX/fze+kde/vFfZH5/gZctguNBqmtKdMfr27 ** SIG ** Ly93d3cuc3ltYXV0aC5jb20vcnBhMDAGA1UdHwQpMCcw
** SIG ** Tww9V/Ew1qY2jtaAdtcZLqXNfjQtiQIDAQABo4IB/jCC ** SIG ** JaAjoCGGH2h0dHA6Ly9zMS5zeW1jYi5jb20vcGNhMy1n
** SIG ** AfowEgYDVR0TAQH/BAgwBgEB/wIBADBwBgNVHSAEaTBn ** SIG ** NS5jcmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF
** SIG ** MGUGC2CGSAGG+EUBBxcDMFYwKAYIKwYBBQUHAgEWHGh0 ** SIG ** BwMDMA4GA1UdDwEB/wQEAwIBBjApBgNVHREEIjAgpB4w
** SIG ** dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9jcHMwKgYIKwYB ** SIG ** HDEaMBgGA1UEAxMRU3ltYW50ZWNQS0ktMS01NjcwHQYD
** SIG ** BQUHAgIwHhocaHR0cHM6Ly93d3cudmVyaXNpZ24uY29t ** SIG ** VR0OBBYEFJY7U/B5M5evfYPvLivMyreGHnJmMB8GA1Ud
** SIG ** L3JwYTAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwE ** SIG ** IwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
** SIG ** YTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAHBgUr ** SIG ** SIb3DQEBCwUAA4IBAQAThRoeaak396C9pK9+HWFT/p2M
** SIG ** DgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0 ** SIG ** XgymdR54FyPd/ewaA1U5+3GVx2Vap44w0kRaYdtwb9oh
** SIG ** cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYw ** SIG ** BcIuc7pJ8dGT/l3JzV4D4ImeP3Qe1/c4i6nWz7s1LzNY
** SIG ** NAYDVR0fBC0wKzApoCegJYYjaHR0cDovL2NybC52ZXJp ** SIG ** qJJW0chNO4LmeYQW/CiwsUfzHaI+7ofZpn+kVqU/rYQu
** SIG ** c2lnbi5jb20vcGNhMy1nNS5jcmwwNAYIKwYBBQUHAQEE ** SIG ** Kd58vKiqoz0EAeq6k6IOUCIpF0yH5DoRX9akJYmbBWsv
** SIG ** KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC52ZXJp ** SIG ** tMkBTCd7C6wZBSKgYBU/2sn7TUyP+3Jnd/0nlMe6NQ6I
** SIG ** c2lnbi5jb20wHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsG ** SIG ** Sf6N/SivShK9DbOXBd5EDBX6NisD3MFQAfGhEV0U5eK9
** SIG ** AQUFBwMDMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQDExBW ** SIG ** J0tUviuEXg+mw3QFCu+Xw4kisR93873NQ9TxTKk/tYuE
** SIG ** ZXJpU2lnbk1QS0ktMi04MB0GA1UdDgQWBBTPmanqeyb0 ** SIG ** r2Ty0BQhMYIEPDCCBDgCAQEwgZMwfzELMAkGA1UEBhMC
** SIG ** S8mOj9fwBSbv49KnnTAfBgNVHSMEGDAWgBR/02Wnwt3s ** SIG ** VVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9u
** SIG ** u/AwCfNDOfoCrzMxMzANBgkqhkiG9w0BAQUFAAOCAQEA ** SIG ** MR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3Jr
** SIG ** ViLmNKTEYctIuQGtVqhkD9mMkcS7zAzlrXqgIn/fRzhK ** SIG ** MTAwLgYDVQQDEydTeW1hbnRlYyBDbGFzcyAzIFNIQTI1
** SIG ** LWzRf3EafOxwqbHwT+QPDFP6FV7+dJhJJIWBJhyRFEew ** SIG ** NiBDb2RlIFNpZ25pbmcgQ0ECEDB6NnqqPmiBpvlPCMs7
** SIG ** TGOMu6E01MZF6A2FJnMD0KmMZG3ccZLmRQVgFVlROfxY ** SIG ** OWQwCQYFKw4DAhoFAKBwMBAGCisGAQQBgjcCAQwxAjAA
** SIG ** FGv+1KTteWsIDEFy5zciBgm+I+k/RJoe6WGdzLGQXPw9 ** SIG ** MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
** SIG ** 0o2sQj1lNtS0PUAoj5sQzyMmzEsgy5AfXYxMNMo82OU3 ** SIG ** AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3
** SIG ** 1m+lIL006ybZrg3nxZr3obQhkTNvhuhYuyV8dA5Y/nUb ** SIG ** DQEJBDEWBBR6dTC/boD4AfXjRZuTKr/1zNmntzANBgkq
** SIG ** Yz/OMXybjxuWnsVTdoRbnK2R+qztk7pdyCFTwoJTY68S ** SIG ** hkiG9w0BAQEFAASCAQBVo/5CV3pBnv4oB8K/31oUjG1k
** SIG ** DVCHERs9VFKWiiycPZIaCJoFLseTpUiR0zGCBHIwggRu ** SIG ** 4oE2t6uXQQeMFe1oVWCcph6cS7RmxOoqyk5bV8flKUT1
** SIG ** AgEBMIHJMIG0MQswCQYDVQQGEwJVUzEXMBUGA1UEChMO ** SIG ** 9Sna5fDh2xi3PG/HGZ4Ua4bWs210Qno8G9K/vh/PZeC0
** SIG ** VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWdu ** SIG ** /wqsYYWRKc6hyaQ3oc2whaalNNXGg+fQg/aNxHmuwgIY
** SIG ** IFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9m ** SIG ** Cljrdlr6bXThz7bOY6/NDddlqP1Pwnc3nihjPORnyf92
** SIG ** IHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20v ** SIG ** 2lpLjQKZvGDSTfpy9BKb5ZHwAtZyDI3enUXrKtOYjh4e
** SIG ** cnBhIChjKTEwMS4wLAYDVQQDEyVWZXJpU2lnbiBDbGFz ** SIG ** T+jbSX98K5L6dP/7BNqt4HsLXINTB2EjOQtRPCn5botw
** SIG ** cyAzIENvZGUgU2lnbmluZyAyMDEwIENBAhBAh4tnZ5Cl ** SIG ** 9cTczoWFiy8CQBve8GizZHKVkuH1bdc2uT+EvhjQEr3z
** SIG ** lwQonpQDAhobMAkGBSsOAwIaBQCgcDAQBgorBgEEAYI3 ** SIG ** FXb8CWovoYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0
** SIG ** AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB ** SIG ** AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
** SIG ** BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAj ** SIG ** bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h
** SIG ** BgkqhkiG9w0BCQQxFgQURfdjcZbCX2qVF2L4B1Tav0Pa ** SIG ** bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g
** SIG ** WKcwDQYJKoZIhvcNAQEBBQAEggEA472bWClJxzL1outD ** SIG ** RzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBd
** SIG ** xCZAdWDT+wAlfXPVKFz3BGJWLpmGdYMA6LW4GtCfmjsa ** SIG ** MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI
** SIG ** gxD0d7DtjCFHj6fbHjyuNLUaoziOrzrnqbcPiTg4l0zj ** SIG ** hvcNAQkFMQ8XDTE2MDkxMDA3MjMzNFowIwYJKoZIhvcN
** SIG ** 73GsCXrWlrfGIztSIYo4pDKD/VegItUCLwE6ykTXUbXk ** SIG ** AQkEMRYEFPXD/Zju3XrJ5FHNdYlywwjm6bxiMA0GCSqG
** SIG ** 0A8hvAePwtXsn0DL1YpQWtS1goXuDCemjV1AVS09lTi0 ** SIG ** SIb3DQEBAQUABIIBAJIsJ9KLVyoPNgRe4QK0z/ssrOlc
** SIG ** 1varmjW04tWMjRytDhPipQqufgLFF0HgOJ7+kbYnJFvp ** SIG ** NPZYckBVcPIvDp9J3jemLzqAXKLRvNgifYQRy8TQVRG5
** SIG ** ssCutP0wky71xcZ+vP/SS0aa4v4VIG7/pTCvXNP+DPIi ** SIG ** hjOtVrmHSqYJFJgih/2gVLjfuJ6P4Z7ya+UL1tdNTrfY
** SIG ** CNHVtBsBhehVWl18k8TlsFCj77FRfnh8C/57mgF8mQcJ ** SIG ** eBSAeUP5t59GsX9nnyxrvOFuC1gUOlvMmfCywWmLI8N1
** SIG ** epdsA2ObHKO0mPbbRKGCAgswggIHBgkqhkiG9w0BCQYx ** SIG ** eyGamCkEmho4yDW/AHHUNPc6Ou2XiPMdy9EFvZ+aSv9p
** SIG ** ggH4MIIB9AIBATByMF4xCzAJBgNVBAYTAlVTMR0wGwYD ** SIG ** ChD89Y9Tpm//1wEezp5FvkW7yqhp8sHKsDlQ9Ugi3wq0
** SIG ** VQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEwMC4GA1UE ** SIG ** NMnswUVNekGnA4INP+C8PoExozoftlhMQCNkFf2gnmz+
** SIG ** AxMnU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNl ** SIG ** AuyM/w5rUzTReuw1dgaSadktExzlZqVQMdSmkrKXEZZj
** SIG ** cyBDQSAtIEcyAhAOz/Q4yP6/NW4E2GqYGxpQMAkGBSsO ** SIG ** HIABnZo=
** SIG ** AwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcB
** SIG ** MBwGCSqGSIb3DQEJBTEPFw0xNTAyMjUwODA3MDZaMCMG
** SIG ** CSqGSIb3DQEJBDEWBBQUr7p8AAmXEPXeHBw6ERvoB190
** SIG ** dTANBgkqhkiG9w0BAQEFAASCAQA9wy0gHQOXkjzax1Tg
** SIG ** rrA+QrDwOSX0ZD8oYlyyRQwxetj21R43BDjM12Hx29QW
** SIG ** S4AWntGBAED0sFK1UghluXo560kNh1Ks0qRXoVw5uuR0
** SIG ** Y3ZRXJYIIvKDzjM+YD6H1J5cvLDrG7iqmxJvGuOad1Vr
** SIG ** y4wQEFurQ0aqOdYEql6nMrqVvDl0BamdKBqhzwybERJA
** SIG ** TdYlNMZIAfsFkQVt7ZVYtVcgTF9AMUaVJdV3n71Qoulp
** SIG ** MUDxlJdwbk8VbYffSyQm/V0hC39wD38PTyNpNQQE5Psu
** SIG ** eHnixZjMHhGUuXEDU077Fy3iyP8s+1gDHCTOvRzt9DSq
** SIG ** LxZXGm05rtzUo/vl
</signature> </signature>
</package> </package>