UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

724 lines (721 loc) 36 kB
import { throwError } from 'rxjs'; import { catchError, tap } from 'rxjs/operators'; import { Cim } from './cim'; import { headerConstants } from './http-constants'; import { Net } from './net'; import { NodeCimOutput } from './node-connection'; import { PowerShellAlternate } from './powershell-alternate'; /** * The CIM Connection class. */ export class CimConnection { nodeConnection; batchConnection; /** * Initializes a new instance of the CimService class. * * @param nodeConnection the NodeConnection class instance injected. * @param batchConnection the BatchConnection class instance injected. */ constructor(nodeConnection, batchConnection) { this.nodeConnection = nodeConnection; this.batchConnection = batchConnection; } /** * CIM GET MultipleInstances * * @param nodeName the name of the node to use for this request * @param namespace the cim namespace. * @param className the class name. * @param options the options for this request. * @return Observable<any> the query observable. */ getInstanceMultiple(nodeName, namespace, className, options) { this.setPowerShellParameters(options, NodeCimOutput.Multiple); const observable = PowerShellAlternate.create(this.nodeConnection, nodeName, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlMultipleInstances(namespace, className); return this.nodeConnection.get(nodeName, cimUrl, options) .pipe(catchError(error => this.handleJeaFallback(error, nodeName, options))); } /** * CIM GET SingleInstance * * @param nodeName the name of the node to use for this request * @param namespace the cim namespace. * @param className the class name. * @param keyProperties the key properties object. * @param options the options for this request. * @return Observable<any> the query observable. */ getInstanceSingle(nodeName, namespace, className, keyProperties, options) { this.setPowerShellParameters(options, NodeCimOutput.Single, keyProperties); const observable = PowerShellAlternate.create(this.nodeConnection, nodeName, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlSingleInstance(namespace, className, keyProperties); return this.nodeConnection.get(nodeName, cimUrl, options) .pipe(catchError(error => this.handleJeaFallback(error, nodeName, options))); } /** * CIM POST InstanceMethod * * @param nodeName the name of the node to use for this request * @param namespace the cim namespace. * @param className the class name. * @param methodName the method name. * @param keyProperties the key properties object. * @param data the method input data. * @param options the options for this request. * @return Observable<any> the query observable. */ invokeMethodInstance(nodeName, namespace, className, methodName, keyProperties, data, options) { this.setPowerShellParameters(options, NodeCimOutput.Result, keyProperties, data && data.parameters); const observable = PowerShellAlternate.create(this.nodeConnection, nodeName, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlInstanceMethod(namespace, className, methodName, keyProperties); return this.nodeConnection.post(nodeName, cimUrl, data, options) .pipe(catchError(error => this.handleJeaFallback(error, nodeName, options))); } /** * CIM POST StaticMethod * * @param nodeName the name of the node to use for this request * @param namespace the cim namespace. * @param className the class name. * @param methodName the method name. * @param data the method input data. * @param options the options for this request. * @return Observable<any> the query observable. */ invokeMethodStatic(nodeName, namespace, className, methodName, data, options) { this.setPowerShellParameters(options, NodeCimOutput.Result, data && data.parameters); const observable = PowerShellAlternate.create(this.nodeConnection, nodeName, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlStaticMethod(namespace, className, methodName); return this.nodeConnection.post(nodeName, cimUrl, data, options) .pipe(catchError(error => this.handleJeaFallback(error, nodeName, options))); } /** * CIM PUT SingleInstance * * @param nodeName the name of the node to use for this request * @param namespace the cim namespace. * @param className the class name. * @param keyProperties the key properties object. * @param data the method input data. * @param options the options for this request. * @return Observable<any> the query observable. */ setInstance(nodeName, namespace, className, keyProperties, data, options) { this.setPowerShellParameters(options, NodeCimOutput.Single, keyProperties, data && data.properties); const observable = PowerShellAlternate.create(this.nodeConnection, nodeName, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlSingleInstance(namespace, className, keyProperties); return this.nodeConnection.put(nodeName, cimUrl, data, options) .pipe(catchError(error => this.handleJeaFallback(error, nodeName, options))); } /** * CIM PATCH SingleInstance * * @param nodeName the name of the node to use for this request * @param namespace the cim namespace. * @param className the class name. * @param keyProperties the key properties object. * @param data the method input data. * @param options the options for this request. * @return Observable<any> the query observable. */ modifyInstance(nodeName, namespace, className, keyProperties, data, options) { this.setPowerShellParameters(options, NodeCimOutput.Single, keyProperties, data && data.properties); const observable = PowerShellAlternate.create(this.nodeConnection, nodeName, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlSingleInstance(namespace, className, keyProperties); return this.nodeConnection.patch(nodeName, cimUrl, data, options) .pipe(catchError(error => this.handleJeaFallback(error, nodeName, options))); } /** * CIM DELETE SingleInstance * * @param nodeName the name of the node to use for this request * @param namespace the cim namespace. * @param className the class name. * @param keyProperties the key properties object. * @param options the options for this request. * @return Observable<any> the query observable. */ deleteInstance(nodeName, namespace, className, keyProperties, options) { this.setPowerShellParameters(options, NodeCimOutput.Single, keyProperties); const observable = PowerShellAlternate.create(this.nodeConnection, nodeName, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlSingleInstance(namespace, className, keyProperties); return this.nodeConnection.delete(nodeName, cimUrl, null, options) .pipe(catchError(error => this.handleJeaFallback(error, nodeName, options))); } /** * CIM POST WqlQuery * * @param nodeName the name of the node to use for this request * @param namespace the cim namespace. * @param query the WQL string. * @param options the options for this request. * @return Observable<any> the query observable. */ getInstanceQuery(nodeName, namespace, query, options) { this.setPowerShellParameters(options, NodeCimOutput.Query, options && options.powerShellParameters); const observable = PowerShellAlternate.create(this.nodeConnection, nodeName, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlWqlQuery(namespace); return this.nodeConnection.post(nodeName, cimUrl, JSON.stringify({ query: query }), options) .pipe(catchError(error => this.handleJeaFallback(error, nodeName, options))); } /** * Handle the fallback from CIM to powershell with JEA, if applicable * @param error The error to handle * @param nodeName The node name * @param options The request options */ handleJeaFallback(error, nodeName, options) { const authError = Net.isUnauthorized(error); const responseEndpoint = error && error.xhr && error.xhr.getResponseHeader(headerConstants.POWERSHELL_ENDPOINT); const requestEndpoint = options && options.powerShellEndpoint; if (authError && responseEndpoint && requestEndpoint !== responseEndpoint) { options.powerShellEndpoint = responseEndpoint; const powershellRequest = PowerShellAlternate.create(this.nodeConnection, nodeName, options); if (powershellRequest) { return powershellRequest .pipe(tap(() => { // The JEA request went through - persist this context in authorization manager. this.nodeConnection.saveJeaContext(nodeName, responseEndpoint); })); } } return throwError(() => error); } /********************************** * Cim Batch Section **********************************/ /** * CIM GET MultipleInstances for list of nodes * * @param nodeNamesList the Nodes to use for this request. * @param namespace the cim namespace. * @param className the class name. * @param options the options for this request. * @return Observable<BatchResponseItem[]> the query observable. */ getBatchInstanceMultiple(nodeNamesList, namespace, className, options) { this.setPowerShellParameters(options, NodeCimOutput.Multiple); const observable = PowerShellAlternate.createBatch(this.nodeConnection, this.batchConnection, nodeNamesList, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlMultipleInstances(namespace, className); const urlList = []; for (let index = 0; index < nodeNamesList.length; index++) { urlList.push(cimUrl); } return this.batchConnection.get(nodeNamesList, urlList, options); } /** * CIM GET SingleInstance for list of nodes * * @param nodeNamesList the Nodes to use for this request. * @param namespace the cim namespace. * @param className the class name. * @param keyProperties the key properties object. * @param options the options for this request. * @return Observable<BatchResponseItem[]> the query observable. */ getBatchInstanceSingle(nodeNamesList, namespace, className, keyProperties, options) { this.setPowerShellParameters(options, NodeCimOutput.Single, keyProperties); const observable = PowerShellAlternate.createBatch(this.nodeConnection, this.batchConnection, nodeNamesList, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlSingleInstance(namespace, className, keyProperties); const urlList = []; for (let index = 0; index < nodeNamesList.length; index++) { urlList.push(cimUrl); } return this.batchConnection.get(nodeNamesList, urlList, options); } /** * CIM POST InstanceMethod for list of nodes * * @param nodeNamesList the Nodes to use for this request. * @param namespace the cim namespace. * @param className the class name. * @param methodName the method name. * @param keyProperties the key properties object. * @param data the method input data. * @param options the options for this request. * @return Observable<BatchResponseItem[]> the query observable. */ invokeBatchMethodInstance(nodeNamesList, namespace, className, methodName, keyProperties, data, options) { this.setPowerShellParameters(options, NodeCimOutput.Result, keyProperties, data && data.parameters); const observable = PowerShellAlternate.createBatch(this.nodeConnection, this.batchConnection, nodeNamesList, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlInstanceMethod(namespace, className, methodName, keyProperties); const body = data ? JSON.stringify(data) : null; return this.cimBatchPost(nodeNamesList, cimUrl, body, options); } /** * CIM POST StaticMethod for list of nodes * * @param nodeNamesList the Nodes to use for this request. * @param namespace the cim namespace. * @param className the class name. * @param methodName the method name. * @param data the method input data. * @param options the options for this request. * @return Observable<BatchResponseItem[]> the query observable. */ invokeBatchMethodStatic(nodeNamesList, namespace, className, methodName, data, options) { this.setPowerShellParameters(options, NodeCimOutput.Result, data && data.parameters); const observable = PowerShellAlternate.createBatch(this.nodeConnection, this.batchConnection, nodeNamesList, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlStaticMethod(namespace, className, methodName); const body = data ? JSON.stringify(data) : null; return this.cimBatchPost(nodeNamesList, cimUrl, body, options); } /** * CIM PUT SingleInstance for list of nodes * * @param nodeName the name of the node to use for this request * @param namespace the cim namespace. * @param className the class name. * @param keyProperties the key properties object. * @param data the method input data. * @param options the options for this request. * @return Observable<BatchResponseItem[]> the query observable. */ setBatchInstance(nodeNamesList, namespace, className, keyProperties, data, options) { this.setPowerShellParameters(options, NodeCimOutput.Single, keyProperties, data && data.properties); const observable = PowerShellAlternate.createBatch(this.nodeConnection, this.batchConnection, nodeNamesList, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlSingleInstance(namespace, className, keyProperties); const urlList = []; const dataList = []; for (let index = 0; index < nodeNamesList.length; index++) { urlList.push(cimUrl); dataList.push(JSON.stringify(data)); } return this.batchConnection.put(nodeNamesList, urlList, dataList, options); } /** * CIM DELETE SingleInstance for list of nodes * * @param nodeNamesList the Nodes to use for this request. * @param namespace the cim namespace. * @param className the class name. * @param keyProperties the key properties object. * @param options the options for this request. * @return Observable<BatchResponseItem[]> the query observable. */ deleteBatchInstance(nodeNamesList, namespace, className, keyProperties, options) { this.setPowerShellParameters(options, NodeCimOutput.Single, keyProperties); const observable = PowerShellAlternate.createBatch(this.nodeConnection, this.batchConnection, nodeNamesList, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlSingleInstance(namespace, className, keyProperties); const urlList = []; for (let index = 0; index < nodeNamesList.length; index++) { urlList.push(cimUrl); } return this.batchConnection.delete(nodeNamesList, urlList, options); } /** * CIM POST WqlQuery for list of nodes * * @param nodeNamesList the Nodes to use for this request. * @param namespace the cim namespace. * @param query the WQL string. * @param options the options for this request. * @return Observable<BatchResponseItem[]> the query observable. */ getBatchInstanceQuery(nodeNamesList, namespace, query, options) { this.setPowerShellParameters(options, NodeCimOutput.Query, options && options.powerShellParameters); const observable = PowerShellAlternate.createBatch(this.nodeConnection, this.batchConnection, nodeNamesList, options); if (observable) { return observable; } const cimUrl = Cim.cimUrlWqlQuery(namespace); const body = JSON.stringify({ query: query }); return this.cimBatchPost(nodeNamesList, cimUrl, body, options); } /** * Cim batch post helper * * @param nodeNamesList The list of Nodes to run the call against * @param cimUrl The CIM end point to call * @param jsonBody The body of Post in json format. * @param options the request options. */ cimBatchPost(nodeNamesList, cimUrl, jsonBody, options) { const urlList = []; const bodyList = []; for (let index = 0; index < nodeNamesList.length; index++) { urlList.push(cimUrl); if (jsonBody) { bodyList.push(jsonBody); } } return this.batchConnection.post(nodeNamesList, urlList, bodyList, options); } /** * Set PowerShell parameters to the options object. * * @param options The node request options. * @param outputType The output data type. * @param keys The key data. * @param data The arguments data. */ setPowerShellParameters(options, cimOutput, keys, data) { if (options == null || options.powerShell == null) { return; } options.powerShellContext = { cimOutput, parameters: { ...(keys || {}), ...(data || {}) } }; } } //# sourceMappingURL=cim-connection.js.map // SIG // Begin signature block // SIG // MIIoOgYJKoZIhvcNAQcCoIIoKzCCKCcCAQExDzANBglg // SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor // SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC // SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg // SIG // v/5OwPfwpoyidfU46QMkhc5cpeSXyXJkLRYbUMmHPbCg // SIG // gg2FMIIGAzCCA+ugAwIBAgITMwAABAO91ZVdDzsYrQAA // SIG // AAAEAzANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJV // SIG // UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH // SIG // UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv // SIG // cmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBT // SIG // aWduaW5nIFBDQSAyMDExMB4XDTI0MDkxMjIwMTExM1oX // SIG // DTI1MDkxMTIwMTExM1owdDELMAkGA1UEBhMCVVMxEzAR // SIG // BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v // SIG // bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv // SIG // bjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9u // SIG // MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA // SIG // n3RnXcCDp20WFMoNNzt4s9fV12T5roRJlv+bshDfvJoM // SIG // ZfhyRnixgUfGAbrRlS1St/EcXFXD2MhRkF3CnMYIoeMO // SIG // MuMyYtxr2sC2B5bDRMUMM/r9I4GP2nowUthCWKFIS1RP // SIG // lM0YoVfKKMaH7bJii29sW+waBUulAKN2c+Gn5znaiOxR // SIG // qIu4OL8f9DCHYpME5+Teek3SL95sH5GQhZq7CqTdM0fB // SIG // w/FmLLx98SpBu7v8XapoTz6jJpyNozhcP/59mi/Fu4tT // SIG // 2rI2vD50Vx/0GlR9DNZ2py/iyPU7DG/3p1n1zluuRp3u // SIG // XKjDfVKH7xDbXcMBJid22a3CPbuC2QJLowIDAQABo4IB // SIG // gjCCAX4wHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYB // SIG // BQUHAwMwHQYDVR0OBBYEFOpuKgJKc+OuNYitoqxfHlrE // SIG // gXAZMFQGA1UdEQRNMEukSTBHMS0wKwYDVQQLEyRNaWNy // SIG // b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQx // SIG // FjAUBgNVBAUTDTIzMDAxMis1MDI5MjYwHwYDVR0jBBgw // SIG // FoAUSG5k5VAF04KqFzc3IrVtqMp1ApUwVAYDVR0fBE0w // SIG // SzBJoEegRYZDaHR0cDovL3d3dy5taWNyb3NvZnQuY29t // SIG // L3BraW9wcy9jcmwvTWljQ29kU2lnUENBMjAxMV8yMDEx // SIG // LTA3LTA4LmNybDBhBggrBgEFBQcBAQRVMFMwUQYIKwYB // SIG // BQUHMAKGRWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w // SIG // a2lvcHMvY2VydHMvTWljQ29kU2lnUENBMjAxMV8yMDEx // SIG // LTA3LTA4LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3 // SIG // DQEBCwUAA4ICAQBRaP+hOC1+dSKhbqCr1LIvNEMrRiOQ // SIG // EkPc7D6QWtM+/IbrYiXesNeeCZHCMf3+6xASuDYQ+AyB // SIG // TX0YlXSOxGnBLOzgEukBxezbfnhUTTk7YB2/TxMUcuBC // SIG // P45zMM0CVTaJE8btloB6/3wbFrOhvQHCILx41jTd6kUq // SIG // 4bIBHah3NG0Q1H/FCCwHRGTjAbyiwq5n/pCTxLz5XYCu // SIG // 4RTvy/ZJnFXuuwZynowyju90muegCToTOwpHgE6yRcTv // SIG // Ri16LKCr68Ab8p8QINfFvqWoEwJCXn853rlkpp4k7qzw // SIG // lBNiZ71uw2pbzjQzrRtNbCFQAfmoTtsHFD2tmZvQIg1Q // SIG // VkzM/V1KCjHL54ItqKm7Ay4WyvqWK0VIEaTbdMtbMWbF // SIG // zq2hkRfJTNnFr7RJFeVC/k0DNaab+bpwx5FvCUvkJ3z2 // SIG // wfHWVUckZjEOGmP7cecefrF+rHpif/xW4nJUjMUiPsyD // SIG // btY2Hq3VMLgovj+qe0pkJgpYQzPukPm7RNhbabFNFvq+ // SIG // kXWBX/z/pyuo9qLZfTb697Vi7vll5s/DBjPtfMpyfpWG // SIG // 0phVnAI+0mM4gH09LCMJUERZMgu9bbCGVIQR7cT5YhlL // SIG // t+tpSDtC6XtAzq4PJbKZxFjpB5wk+SRJ1gm87olbfEV9 // SIG // SFdO7iL3jWbjgVi1Qs1iYxBmvh4WhLWr48uouzCCB3ow // SIG // ggVioAMCAQICCmEOkNIAAAAAAAMwDQYJKoZIhvcNAQEL // SIG // BQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo // SIG // aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK // SIG // ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMT // SIG // KU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv // SIG // cml0eSAyMDExMB4XDTExMDcwODIwNTkwOVoXDTI2MDcw // SIG // ODIxMDkwOVowfjELMAkGA1UEBhMCVVMxEzARBgNVBAgT // SIG // Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc // SIG // BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYG // SIG // A1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0Eg // SIG // MjAxMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC // SIG // ggIBAKvw+nIQHC6t2G6qghBNNLrytlghn0IbKmvpWlCq // SIG // uAY4GgRJun/DDB7dN2vGEtgL8DjCmQawyDnVARQxQtOJ // SIG // DXlkh36UYCRsr55JnOloXtLfm1OyCizDr9mpK656Ca/X // SIG // llnKYBoF6WZ26DJSJhIv56sIUM+zRLdd2MQuA3WraPPL // SIG // bfM6XKEW9Ea64DhkrG5kNXimoGMPLdNAk/jj3gcN1Vx5 // SIG // pUkp5w2+oBN3vpQ97/vjK1oQH01WKKJ6cuASOrdJXtjt // SIG // 7UORg9l7snuGG9k+sYxd6IlPhBryoS9Z5JA7La4zWMW3 // SIG // Pv4y07MDPbGyr5I4ftKdgCz1TlaRITUlwzluZH9TupwP // SIG // rRkjhMv0ugOGjfdf8NBSv4yUh7zAIXQlXxgotswnKDgl // SIG // mDlKNs98sZKuHCOnqWbsYR9q4ShJnV+I4iVd0yFLPlLE // SIG // tVc/JAPw0XpbL9Uj43BdD1FGd7P4AOG8rAKCX9vAFbO9 // SIG // G9RVS+c5oQ/pI0m8GLhEfEXkwcNyeuBy5yTfv0aZxe/C // SIG // HFfbg43sTUkwp6uO3+xbn6/83bBm4sGXgXvt1u1L50kp // SIG // pxMopqd9Z4DmimJ4X7IvhNdXnFy/dygo8e1twyiPLI9A // SIG // N0/B4YVEicQJTMXUpUMvdJX3bvh4IFgsE11glZo+TzOE // SIG // 2rCIF96eTvSWsLxGoGyY0uDWiIwLAgMBAAGjggHtMIIB // SIG // 6TAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUSG5k // SIG // 5VAF04KqFzc3IrVtqMp1ApUwGQYJKwYBBAGCNxQCBAwe // SIG // CgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB // SIG // /wQFMAMBAf8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h // SIG // 6qfHMdEjiTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDov // SIG // L2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj // SIG // dHMvTWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNy // SIG // bDBeBggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0 // SIG // dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv // SIG // TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDCB // SIG // nwYDVR0gBIGXMIGUMIGRBgkrBgEEAYI3LgMwgYMwPwYI // SIG // KwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv // SIG // bS9wa2lvcHMvZG9jcy9wcmltYXJ5Y3BzLmh0bTBABggr // SIG // BgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBwAG8AbABp // SIG // AGMAeQBfAHMAdABhAHQAZQBtAGUAbgB0AC4gHTANBgkq // SIG // hkiG9w0BAQsFAAOCAgEAZ/KGpZjgVHkaLtPYdGcimwuW // SIG // EeFjkplCln3SeQyQwWVfLiw++MNy0W2D/r4/6ArKO79H // SIG // qaPzadtjvyI1pZddZYSQfYtGUFXYDJJ80hpLHPM8QotS // SIG // 0LD9a+M+By4pm+Y9G6XUtR13lDni6WTJRD14eiPzE32m // SIG // kHSDjfTLJgJGKsKKELukqQUMm+1o+mgulaAqPyprWElj // SIG // HwlpblqYluSD9MCP80Yr3vw70L01724lruWvJ+3Q3fMO // SIG // r5kol5hNDj0L8giJ1h/DMhji8MUtzluetEk5CsYKwsat // SIG // ruWy2dsViFFFWDgycScaf7H0J/jeLDogaZiyWYlobm+n // SIG // t3TDQAUGpgEqKD6CPxNNZgvAs0314Y9/HG8VfUWnduVA // SIG // KmWjw11SYobDHWM2l4bf2vP48hahmifhzaWX0O5dY0Hj // SIG // Wwechz4GdwbRBrF1HxS+YWG18NzGGwS+30HHDiju3mUv // SIG // 7Jf2oVyW2ADWoUa9WfOXpQlLSBCZgB/QACnFsZulP0V3 // SIG // HjXG0qKin3p6IvpIlR+r+0cjgPWe+L9rt0uX4ut1eBrs // SIG // 6jeZeRhL/9azI2h15q/6/IvrC4DqaTuv/DDtBEyO3991 // SIG // bWORPdGdVk5Pv4BXIqF4ETIheu9BCrE/+6jMpF3BoYib // SIG // V3FWTkhFwELJm3ZbCoBIa/15n8G9bW1qyVJzEw16UM0x // SIG // ghoNMIIaCQIBATCBlTB+MQswCQYDVQQGEwJVUzETMBEG // SIG // A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u // SIG // ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u // SIG // MSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5n // SIG // IFBDQSAyMDExAhMzAAAEA73VlV0POxitAAAAAAQDMA0G // SIG // CWCGSAFlAwQCAQUAoIGuMBkGCSqGSIb3DQEJAzEMBgor // SIG // BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEE // SIG // AYI3AgEVMC8GCSqGSIb3DQEJBDEiBCCeF3XKJgauw21s // SIG // 23fGnKu0UkyPA1e9rOAwFyTwiTrMRTBCBgorBgEEAYI3 // SIG // AgEMMTQwMqAUgBIATQBpAGMAcgBvAHMAbwBmAHShGoAY // SIG // aHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3 // SIG // DQEBAQUABIIBADY4a2a/hu/nkoyOpb9q79LXJJRzqsdt // SIG // ZjDRlnyeOK3LxHwL5TG/m2LMkyfshGZc0fWJZmbvHYq2 // SIG // qnoFfSiyKrefiTqUQQ/qbg2FY+Qv5PqXia75RRzpM0sG // SIG // i3V4NWOrr5yhbUwCnSkvqzCy++SmPtIgthzxaTSpGQ4N // SIG // SxNVDphl7Ti3IS1bM4TLJvGDyG+UNULQuTlizPjrs0K4 // SIG // AUnVBWEnis59ulqBHh+2KT1WpaiTucMi948M7uVS7Wii // SIG // HKTTsm4czELI8kFvMfSYiYImfKoZHalTs+jf+Z685eqU // SIG // iN2o3QduzIFAYpuINPxIwy59z8Hdj4ads1U7mxmpkKGJ // SIG // QnihgheXMIIXkwYKKwYBBAGCNwMDATGCF4Mwghd/Bgkq // SIG // hkiG9w0BBwKgghdwMIIXbAIBAzEPMA0GCWCGSAFlAwQC // SIG // AQUAMIIBUgYLKoZIhvcNAQkQAQSgggFBBIIBPTCCATkC // SIG // AQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEFAAQg // SIG // HWTKZ0pewZbVflu/vamCbHurFEQ9Tn8H0Q8ebU0YWvMC // SIG // BmeuM89A8RgTMjAyNTAyMjAxNTI4MzUuNTk5WjAEgAIB // SIG // 9KCB0aSBzjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgT // SIG // Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc // SIG // BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMG // SIG // A1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9u // SIG // czEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOkUwMDIt // SIG // MDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt // SIG // ZS1TdGFtcCBTZXJ2aWNloIIR7TCCByAwggUIoAMCAQIC // SIG // EzMAAAHuBdMCMLKanacAAQAAAe4wDQYJKoZIhvcNAQEL // SIG // BQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp // SIG // bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT // SIG // FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd // SIG // TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcN // SIG // MjMxMjA2MTg0NTQ0WhcNMjUwMzA1MTg0NTQ0WjCByzEL // SIG // MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x // SIG // EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv // SIG // c29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9z // SIG // b2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMe // SIG // blNoaWVsZCBUU1MgRVNOOkUwMDItMDVFMC1EOTQ3MSUw // SIG // IwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2 // SIG // aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC // SIG // AgEAvvG8pdeihImvMSkuL1S+0RDjkey82Ai1xLVoHqsj // SIG // lZa87hM/gKAmuLQRhEo2x01xAnjDsD/Uz3imimpX01OV // SIG // 0ho6SYaRsefX8TCaE2Fj88w9DtkQJcgZjgQZoiw10Q0C // SIG // S9UbbgI7woi7pVUHojyPFe/h4U0d/dU2wtW3kscF33Si // SIG // amNaJ4w2sKgyQJrcLAP4Jql4B8BfX2VnMCkrl4mQU21O // SIG // X3Jt24YZUTcOXdOC3deWVs1Zf1Q6f4kXqxqNiLP9FsJ/ // SIG // 2t3hjnR6738CG35OpVasGzUBNdTnnZ9rr0YylhMHq1y+ // SIG // 9Drg2fLy88a8tMhHb0PJMvlX6vJnxF0vdO2O6zfx2F+n // SIG // ArAtrKMlxtzsArSwO6NP/pCiWbjqw+R1K0s95H6oA5Zl // SIG // suu8/GWT45IgwtXWFtYze+7eYkpeVqdRygaeyVPEYkSP // SIG // r2NotXG+V9kRJMN1qzVv426H1xLPbeG4HfslPLICp/TL // SIG // VZ0OubOkBu9jP8mlGRthzCN9bZvZqKB9vbzwTvYwzDiL // SIG // tC8M1E5CFn5YHf7xFn0zXD1hEI+37FrkqFbid7gasDZk // SIG // UqZkA80nzGiM7srNKb1dYxVqrasMAnGmP1l7G/2sZMQf // SIG // 8wk3R0gVCfE5t4uDzPbJIrp12PnEqh+fI1pKR22ywNzn // SIG // 7LO3viWzIypk3XI5kpG+aDfKlNcCAwEAAaOCAUkwggFF // SIG // MB0GA1UdDgQWBBQQiM0/GtncIJ69+8Xftr9f3HamCDAf // SIG // BgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBf // SIG // BgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jv // SIG // c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBU // SIG // aW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYI // SIG // KwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8v // SIG // d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p // SIG // Y3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEw // SIG // KDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM // SIG // MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkq // SIG // hkiG9w0BAQsFAAOCAgEAd2cgL2thCjlklaQZ2JM1/H/B // SIG // mY2jrOe+xfaNeAJ4fZSsurUt+MF6D1xMkKdb9YiO6yc2 // SIG // VRu66VM52stp/XLH596esu5GJB6rUroAhpk4ogZMIRX0 // SIG // gcijyNPDJJYLybyk2W+u98hn6RcD40MGXiOhD4/zgLaW // SIG // JE+yFF6jJItQkTCSoHmOMFEQnHCLo3VkZKFb+Cd6v/Oy // SIG // hNKj0JgEfX6jDcYyN2QpVcQOMIjN7TVZUWxfUoKTp41a // SIG // Nz/yOafCXeNYTUlQsf/I96jO2i0irQ8zhFDbPmbY4c55 // SIG // mYFHe/wFhw4cAR3S+e0yPYe54mZHzmTl53GLCsRuIK8k // SIG // 7IVOhurAGKW6nTBP/v4Nbnq+1RiB1LS6t1tAJ5vJQH0v // SIG // T6rYbJGbeeCRdvAh3bBav+11QbRZcS/yoHEMpSTZ4mvm // SIG // p4sVButMlA7dxTBkiSN+MRvTR7M9waaklrnhrSYUOWTd // SIG // CvI7tLzVYBfg79ObIqz4NH7Uin/RVRAqfd6PKIBePI4f // SIG // Ak/wd9pc9Q+k67pOBM3MOxNTobTjH+wx4DzFn+ljnWJ3 // SIG // /h2kice2U1wibFuaDpDNLC4rcQaUqRnI9mI5zc5wqbBD // SIG // 2WrdIfune7pUWlkeURwFMhRUPY0WuylmjRnRC07Ppx0p // SIG // WI2HkKSuUEl44oHSpS0DwZV/vczqBgCYaGX66Y6uJ0Aw // SIG // ggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAV // SIG // MA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzET // SIG // MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk // SIG // bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 // SIG // aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0 // SIG // aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAx // SIG // ODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYT // SIG // AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH // SIG // EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y // SIG // cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l // SIG // LVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEF // SIG // AAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7V // SIG // gtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/H // SIG // ZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKD // SIG // RLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gm // SIG // U3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36M // SIG // EBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+y // SIG // OSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoF // SIG // VZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJi // SIG // ss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGa // SIG // RnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+Autuqfjbs // SIG // Nkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afo // SIG // mXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9 // SIG // ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZk // SIG // i1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y // SIG // 1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV // SIG // 2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0C // SIG // AwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEw // SIG // IwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/ // SIG // LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnp // SIG // cjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8G // SIG // CCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j // SIG // b20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYD // SIG // VR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAwe // SIG // CgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB // SIG // /wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9 // SIG // lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDov // SIG // L2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj // SIG // dHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoG // SIG // CCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDov // SIG // L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNS // SIG // b29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcN // SIG // AQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pc // SIG // FLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHk // SIG // wo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AF // SIG // vonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4 // SIG // U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2 // SIG // EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8Atq // SIG // gcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mj // SIG // dAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZM // SIG // cm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQE // SIG // cb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2f // SIG // pCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBM // SIG // drVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L // SIG // +DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJ // SIG // C4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU // SIG // 5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/ // SIG // 2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDUDCC // SIG // AjgCAQEwgfmhgdGkgc4wgcsxCzAJBgNVBAYTAlVTMRMw // SIG // EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt // SIG // b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp // SIG // b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9w // SIG // ZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT // SIG // TjpFMDAyLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9z // SIG // b2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsO // SIG // AwIaAxUAiKOm1Tb35RcW1Fgg0N2GCsujvpOggYMwgYCk // SIG // fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu // SIG // Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV // SIG // TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N // SIG // aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkq // SIG // hkiG9w0BAQsFAAIFAOthQ4YwIhgPMjAyNTAyMjAwNjAw // SIG // MzhaGA8yMDI1MDIyMTA2MDAzOFowdzA9BgorBgEEAYRZ // SIG // CgQBMS8wLTAKAgUA62FDhgIBADAKAgEAAgIOWwIB/zAH // SIG // AgEAAgITLjAKAgUA62KVBgIBADA2BgorBgEEAYRZCgQC // SIG // MSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQow // SIG // CAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQCJm5tq // SIG // hfJNGnCU6pzufu7oSZKVkv+qUT6NPmaIzZj91+DmimfB // SIG // b0YmUjGNsZHYZ+ZZcsRXkTw2s3ZNXOL4R4lwl1wsBp3L // SIG // eZhHAaaHYdDY4fJAGy5FRPOKH2123IGxiX7HVxJ9cpcg // SIG // c8n5XjhyYVLDie2DU4E4k+SMqAXEkt9Y+mnPhbyFkwji // SIG // j9kjLMnRozEem8SSrQNkwpvhm3a1Nv33xw2xGJbO2QW+ // SIG // +gn7WtZyN8hQytYCvPpEHQwmlEpURvW+AE3UaWklCnpb // SIG // F3IlBTmJNxYxkxl2EWZPRJrr1zrZ3TOAUhcChoymljIQ // SIG // T2I5ozMrbqD0wP4/eS7qmD5oCPXlMYIEDTCCBAkCAQEw // SIG // gZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp // SIG // bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT // SIG // FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd // SIG // TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMA // SIG // AAHuBdMCMLKanacAAQAAAe4wDQYJYIZIAWUDBAIBBQCg // SIG // ggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAv // SIG // BgkqhkiG9w0BCQQxIgQg+QhmEE10mDKtqjW5h+VKNm/K // SIG // 7XTThuyIksc05u6n8ZIwgfoGCyqGSIb3DQEJEAIvMYHq // SIG // MIHnMIHkMIG9BCBPUHcUlYX6vlXX/gz7PuRCJAc/aAkv // SIG // zkH5R5FUYX4wITCBmDCBgKR+MHwxCzAJBgNVBAYTAlVT // SIG // MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS // SIG // ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y // SIG // YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 // SIG // YW1wIFBDQSAyMDEwAhMzAAAB7gXTAjCymp2nAAEAAAHu // SIG // MCIEIL8alJrYHTS+brqaXihIgQYMTOuyPr8/IrVb9C65 // SIG // hr9FMA0GCSqGSIb3DQEBCwUABIICALD8c4i75bYWu0Vf // SIG // jf2zZupBnnRWjuig3z1BwIHhtpApOMpOxWHIuS6aZL9H // SIG // HijbP+yYdQbzzTLVA6mGO6sLorkHLxF5pPTWXYhFQ68F // SIG // 6DUD5a2hvagD/6bxj32gRN9R93+ffeNp/SCmg6ESUHNm // SIG // HxsaVGRyYLXQ35r395v9u5J8X1oDyTM9SxAhnjOhCBP2 // SIG // ggh78n7ZrOWfXBCF0wO8zG7WDdL90Vm8tyq50Skc8ggS // SIG // iNusbHmabi2vzxnep/G2/7GShRVaZL6c7kV+1vDcc/C/ // SIG // XACPwVDOrIev7jL0mP+Q/kei+Q6NMLEQR3LoBlCiYt76 // SIG // lyL/BWM+fNvWR+C8vC5PhBpvnwBk42VJcYbJb2Mgmptq // SIG // HJLeT0LaU7GrQNHFli/QwUv+A56Zu8tRULc17suybzaa // SIG // 3EGPVIeZNLSzACYqRHkexrLknkXZVjC47TE6vnTgCK5e // SIG // 3k+nSUOoY9jdTxTeaM1raigeK8At6veBgS9qfFgh5pa/ // SIG // V3fObb9Eh3ahE06WRn15flLoppblnvEBAM7IiRfjKqFB // SIG // h2GvN65QK7NSjPTgX+48PN10HP5suhgoyPcIE6SFCILS // SIG // rubAffP0C4sQI8MBVlnL8+gwR5bdhuvQrrKB8YIQpS+9 // SIG // FatZPQB+p04wcBFlfzjr++566x3i6zPu6zs2medRvzhK // SIG // wKMKDbyU // SIG // End signature block